如何从sys.tables获取表名并将输出存储在变量中?

时间:2012-05-28 12:41:41

标签: sql stored-procedures

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

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;  

ERROR:

Invalid column name 'table name'

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

最好使用'"正确编写查询。在编写查询时,这样可以减少错误。

您的代码错误是您只使用'而感到困惑。最好只使用'作为变量。

将您的代码编写为:

"SELECT 1 FROM  ' "+@db_name+" '.sys.tables 
    where name=' "+@table_name+" ' ";