1

我编写了一个存储过程,其中使用来自不同两个表的游标收集表名和数据库名。
但是我的问题是当我运行查询以找出数据库中是否存在表时,然后显示错误。现在如何运行查询并将输出存储到变量中?

Declare @table_exist nvarchar(200),@val1 nvarchar(200),@return1 nvarchar(200);
  SET @table_exist= 
    'SELECT 1 FROM '+@db_name+'.sys.tables 
    where name='+@table_name+'';
  EXEC sp_executesql @table_exist,@return1 OUTPUT;  
  select @return1;  

错误:

Invalid column name 'table name'
4

2 回答 2

2

构建动态查询时应该使用quotename :

   SET @table_exist= 
     'SELECT 1 FROM '+ quotename(@db_name)+'.sys.tables 
     where name='+quotename(@table_name)+'';

当面临这样的错误时,最好的办法是print @table_exists看看实际构建了什么。

我没有正确查看您的查询。您缺少撇号:

   SET @table_exist= 
     'SELECT 1 FROM '+ quotename(@db_name)+'.sys.tables 
     where name=''' + @table_name +'''';

更新:

使用输出变量时,您应该在查询中设置它:

  SET @table_exist= 
    'SELECT @return1 = 1 FROM ' + quotename(@db_name) + '.sys.tables 
    where name='''+@table_name+'''';

为防止结果集返回客户端,请创建临时表并将结果集插入其中。在这种情况下,这将只留下一个结果集,即select @return1

  declare @tbl table (exist bit)
  insert into @tbl
  EXEC sp_executesql @table_exist, N'@return1 nvarchar(200) out', @return1 OUT;
  select @return1;
于 2012-05-28T12:54:55.327 回答
1

最好使用'"正确编写查询。这在编写查询时犯的错误更少。

您代码上的错误是您对仅使用'. 最好'仅用于变量。

将您的代码编写为:

"SELECT 1 FROM  ' "+@db_name+" '.sys.tables 
    where name=' "+@table_name+" ' ";
于 2012-05-28T15:28:03.130 回答