我正在学习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;
我一直在寻找能够完成这项工作但无法找到任何答案的答案。我已经尝试将存储过程放入存储过程,然后从那里执行它,但这也不起作用。
帮助将受到高度赞赏。
答案 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;