Не отображать выбранные результаты из динамического SQL в Cursor - PullRequest
0 голосов
/ 24 мая 2018

Я сейчас изучаю SQL и пытаюсь придумать упражнения для себя, и я не могу заставить это работать, хотя это кажется простым:

Я пытаюсь запустить курсор через всеотфильтрованные таблицы в моей базе данных, чтобы затем я мог передать это имя таблицы переменной, которая будет использоваться в DynamicSQL внутри курсора.Конечным результатом должны быть все значения из каждого столбца, в котором есть столбец empid.Тем не менее, сообщение возвращается как «Команды завершены успешно», но я не вижу результатов, несмотря на мой оператор выбора.

Я пытаюсь запустить что-то вроде этого:

    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;

I 'везде искал ответы, чтобы сделать эту работу, но ничего не могу найти.Я пытался вставить хранимую процедуру и затем выполнить ее оттуда, но это тоже не сработало.

Помощь будет высоко оценена.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Спасибо за помощь.После того, как я выслушал ваш совет, я столкнулся с большим количеством ошибок, но, по крайней мере, я смог найти ответы в Интернете.Я также узнал, что вы не можете иметь свою строку 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;
0 голосов
/ 24 мая 2018

DECLARE @SQL Должен быть снаружи, но присваивать переменную внутри цикла while

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

Должен быть в цикле while.

Другое дело - увеличить длину переменной @SQL..

...