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