不在Cursor中显示动态SQL的选择结果

时间:2018-05-24 10:54:42

标签: sql-server select stored-procedures cursor dynamic-sql

我正在学习SQL并尝试为自己考虑练习,即使看起来很简单,我也似乎无法使用它:

我正在尝试在我的db中的所有过滤表中运行游标,这样我就可以将该表名传递给将在游标内的DynamicSQL中使用的变量。最终结果应该是每列中包含“empid”列的所有值。 但是,消息返回“命令已成功完成”,但尽管我的select语句,我仍然看不到任何结果。

我正在尝试运行这样的东西:

    declare @tablename nvarchar(200);
declare @empid int;
declare @sql nvarchar(200) = N'select * from ' + @tablename + N' where empid = ' +@empid;
declare tablecursor cursor for select table_name from information_schema.tables where col_length(table_name, 'empid') is not null;
open tablecursor;
fetch next from tablecursor into @tablename;
while @@fetch_status = 0
begin 
execute sp_executesql @sql, 825
fetch next from tablecursor into @tablename;
end
close tablecursor;
deallocate tablecursor;

我一直在寻找能够完成这项工作但无法找到任何答案的答案。我已经尝试将存储过程放入存储过程,然后从那里执行它,但这也不起作用。

帮助将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

DECLARE @SQL应该在外面,但在while循环中分配变量

SET @SQL = N'SELECT * FROM ' + @tableName 

应该在while循环中。

另一件事是增加@SQL Variable的长度。

答案 1 :(得分:0)

谢谢你的帮助。在听完了你的建议后,我遇到了更多的错误,但至少对于这些我能够在网上找到答案。我还学到的是,当你执行它时,你不能用引号中的sql字符串,因为这会使SSMS将@SQL视为实际字符串而不是变量。我设法让它工作,我的代码现在看起来像这样:

create proc cdr @empid nvarchar(5) as

declare @tablename nvarchar(200);

declare tablecursor cursor for select table_name from information_schema.tables where col_length(table_name, 'empid') is not null;

open tablecursor;

fetch next from tablecursor into @tablename;

declare @sql nvarchar(max)

while @@fetch_status = 0

begin

set @sql = N'select * from ' + @tablename + N' where empid = ' + @empid;

execute sp_executesql @sql

fetch next from tablecursor into @tablename;

end

close tablecursor;

deallocate tablecursor;