Заполнение временной таблицы в операторе t- sql execute - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь заполнить временную таблицу для запроса позже в хранимой процедуре. Поскольку я заполняю данные из нескольких таблиц, я пытаюсь сделать это в al oop, используя выражение EXE C:

Изначально я получил ошибку от моего динамика c sql что я должен объявить переменную таблицы. Я делаю это, но sql вне моей динамической системы c sql не видит данные в моей временной таблице. Вот как выглядит мой SQL:

--Original Query:

DECLARE @sql2 varchar(8000)

set @sql2 = 'INSERT INTO @temp_table SELECT  TOP 10 my_id, my_text FROM my_dynamic_table'
exec(@sql2)

select * from @temp_table  --Normal query

Необходимо объявить табличную переменную "@temp_table" в s et @ sql2 = 'INSERT ... line

DECLARE @sql2 varchar(8000)

DECLARE @temp_table TABLE(my_id bigint NULL, my_text text NULL)

set @sql2 = 'DECLARE @temp_table TABLE(my_id bigint NULL, my_text text NULL);INSERT INTO @temp_table SELECT  TOP 10 my_id, my_text FROM my_dynamic_table;select * from @temp_table;'
exec(@sql2)

select * from @temp_table  --Normal query

Я вижу данные при запуске exe c (@ sql2), но не вижу их в обычном запросе.

1 Ответ

2 голосов
/ 09 января 2020

@temp_table это не временная таблица, это переменная таблицы. Это может звучать педанти c, но в SQL Server это разные понятия.

Вы столкнулись с проблемой объема. В вашем первом запросе процесс exec не имеет доступа к переменным в вашей хранимой процедуре, поэтому он работает во втором запросе. Но во втором запросе @temp_table будет иметь только содержимое INSERT, которое было выполнено в том же вызове.

Вы можете переключиться с переменной таблицы на фактическую временную таблицу, чтобы обойти это. Дочерние процессы имеют доступ к своим родительским временным таблицам.

DROP TABLE IF EXISTS #temp_table;
CREATE TABLE #temp_table (my_id bigint NULL, my_text text NULL);

set @sql2 = 'INSERT INTO #temp_table SELECT  TOP 10 my_id, my_text FROM my_dynamic_table'
exec(@sql2)

select * from #temp_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...