-1

以下代码不起作用,我不确定为什么。

DECLARE @TableName varchar(100)
DECLARE @DBName varchar(50)
DECLARE @FinalTableName varchar(500)
DECLARE @TempDB  varchar(50)

SET @DBName=(select db_name())
SET @TableName = 'tbl_Product'
SET @FinalTableName = @DBName + '-' + @TableName +'-' + cast(CONVERT (date, GETDATE()) as varchar(100))
SET @TempDB = 'MiscDB.sys.objects'

Declare @SQL VarChar (250)
Declare @tableExist VarChar (200)

SET @SQL = 'select @tableExist =  OBJECT_ID FROM ' + @TempDB + ' WHERE object_id = OBJECT_ID(''' + @TableName + ''') AND type in (N''U'')'
exec @SQL

我收到这个错误

消息 911,级别 16,状态 4,第 15 行
数据库 'select @tableExist = OBJECT_ID FROM MiscDB' 不存在。确保输入的名称正确。

但是,如果我直接运行 SQL 语句,它确实可以工作。

4

2 回答 2

2

您的查询可能应该是:

DECLARE 
  @dbname      SYSNAME,
  @tablename   SYSNAME,
  @tableExists INT,
  @sql         NVARCHAR(MAX);

SELECT 
  @dbname    = N'Misc',
  @tablename = N'tbl_product';

SET @sql = N'SELECT @tableExists = [object_id]
    FROM ' + QUOTENAME(@dbname) + '.sys.tables 
    WHERE name = @tablename;';

EXEC sp_executesql @sql,
    N'@tableExists BIT OUTPUT, @tablename SYSNAME',
    @tableExists OUTPUT, @tablename;

PRINT @tableExists;

如果数据库名称是固定的(您似乎已硬编码Misc),则稍微容易一些:

DECLARE 
  @tablename   SYSNAME,
  @tableExists INT,
  @sql         NVARCHAR(MAX);

SELECT 
  @tablename = N'tbl_product';

SET @sql = N'SELECT @tableExists = OBJECT_ID(@tablename, N''U'');';

EXEC Misc..sp_executesql @sql,
    N'@tableExists BIT OUTPUT, @tablename SYSNAME',
    @tableExists OUTPUT, @tablename;

PRINT @tableExists;
于 2012-07-10T18:01:58.977 回答
0

有几个问题-

首先是用动态 SQL 编写的任何内容都在不同的范围内——在动态 SQL 内部,您不能设置在动态 SQL 之外声明的变量。

第二个是 OBJECT_ID() 是由数据库决定的——您在一个可能没有名为 tbl_Product 的表的数据库上执行此操作。

尝试以下操作:

SET @SQL = 'USE ' + @TempDB + ' select OBJECT_ID FROM ' + @TempDB + ' WHERE object_id = OBJECT_ID(''' + @TableName + ''') AND type in (N''U'')'
exec @SQL

这基本上是从顶部开始的“从现在开始使用@TempDB”,因此您不必处理其中一些范围问题(试图从当前连接的数据库中找到 ObjectId),我们还删除了设置范围内的变量,因为这不起作用。

于 2012-07-10T18:05:41.460 回答