Выполнить sp_executeSql для выбора... в #table, но не можете выбрать данные таблицы темпа
пытался выбрать... в таблицу temp #TempTable в sp_Executedsql.
Не его успешно вставили или нет, но там там написаны сообщения
(Затронуто 359 строк), что означает успешное включение?
Script ниже
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable
from SPCTable with(nolock)
where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To';
SET @Sql = 'DECLARE @Date_From VARCHAR(10);
DECLARE @Date_To VARCHAR(10);
SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
'+ @Sql;
EXECUTE sp_executesql @Sql;
После выполнения он возвращает мне сообщения (359 строк).
Затем при попытке выбрать данные из #TempTable.
Select * From #TempTable;
Он возвращает меня:
Msg 208, Level 16, State 0, Line 2
Invalid object name '#TempTable'.
Предполагалось, что он работает только с секцией "select". Вставка не работает.
как это исправить?
Ответы
Ответ 1
Локальная временная таблица #table_name
видна только в текущем сеансе, глобальные временные таблицы ##table_name
видны во всех сеансах. Оба живут до закрытия сессии.
sp_executesql
- создает свою собственную сессию (возможно, слово "область" было бы лучше), так что почему это происходит.
Ответ 2
Использование глобальной временной таблицы в этом сценарии может вызвать проблемы, так как таблица будет существовать между сеансами и может привести к некоторым проблемам, использующим вызывающий код асинхронно.
Локальная временная таблица может использоваться, если она определена до вызова sp_executesql, например.
CREATE TABLE #tempTable(id int);
sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable';
SELECT * FROM #tempTable;
Ответ 3
ваша временная таблица в динамическом SQL не входит в область нединамической SQL-части.
Посмотрите, как с этим справиться: Немного о локальных таблицах temp сервера SQL
Ответ 4
Временные таблицы живут только до тех пор, пока они создают соединение. Я ожидаю, что вы случайно намерены выдать выбор по отдельному соединению. Вы можете протестировать это, мгновенно сделав свою вставку в невременную таблицу и посмотрев, есть ли у вас данные. Если это так, вы можете вернуться к исходному решению и просто не забудьте передать объект подключения в свой выбор.
Ответ 5
В вашей строке @sql
не вставляйте into #TempTable
. Вместо этого вызовите оператор SELECT
без инструкции INSERT
.
Наконец, вставьте результаты во временную таблицу так:
INSERT INTO @tmpTbl EXEC sp_executesql @sql
Ответ 6
Чтобы обойти эту проблему, сначала используйте команду CREATE TABLE #TEMPTABLE, чтобы создать пустую таблицу temp перед запуском sp_executesql. Затем запустите INSERT INTO #TEMPTABLE с помощью sp_executesql. Это сработает. Вот как я преодолеваю эту проблему, поскольку у меня есть настройка, в которой все мои запросы обычно запускаются через sp_executesql.
Ответ 7
declare @sql varchar(1000)
set @sql="select * into #t from table;"
set @sql [email protected] + "select * from #t;"
execute SP_EXECUTESQL @sql