Подтвердить что ты не робот

Выполнить 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". Вставка не работает. как это исправить?

4b9b3361

Ответ 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;

Ответ 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