Выполните sp executeSql для select...в #table, но не можете выбрать данные временной таблицы

пытаюсь выбрать...в временную таблицу #TempTable в sp_Executedsql. Не его успешно вставили или нет, но там сообщения там написаны (359 подряд(ов)) что значит успешно вставлен? Скрипт ниже

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'.

подозрение своей работе только выбрать раздел. Этот вставка не работает. как это исправить?

8 ответов


локальная временная таблица #table_name отображается только в текущей сессии, global temporary ##table_name таблицы отображаются во всех сеансах. Оба живут до закрытия сессии. sp_executesql - создает свой собственный сеанс (возможно, слово "область" было бы лучше), поэтому это происходит.


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

локальная временная таблица может использоваться, если она определена перед вызовом sp_executesql, например

CREATE TABLE #tempTable(id int);

sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable';

SELECT * FROM #tempTable;

ваша временная таблица в динамическом SQL выходит за рамки не динамической части SQL.

посмотрите здесь, как справиться с этим:немного о локальных временных таблицах sql server


в своем @sql строка, не вставлять into #TempTable. Вместо этого позвоните своему SELECT заявление без INSERT заявление.

наконец, вставьте результаты во временную таблицу следующим образом:

INSERT INTO @tmpTbl EXEC sp_executesql @sql

кроме того, вам нужно будет объявить временную таблицу, если вы используете этот подход

DECLARE @tmpTbl TABLE (
    //define columns here...
)

временные таблицы живут только до тех пор, пока соединение, которое их создает. Я ожидал бы, что вы непреднамеренно выдаете select на отдельном соединении. Вы можете проверить это, мгновенно выполнив вставку в непостоянную таблицу и увидев, есть ли ваши данные. Если это так, вы можете вернуться к исходному решению и просто передать объект подключения в select.


чтобы обойти эту проблему, используйте команду CREATE TABLE #TEMPTABLE для создания пустой временной таблицы перед запуском sp_executesql. Затем запустите вставку в #TEMPTABLE с помощью sp_executesql. Это сработает. Вот как я преодолеваю эту проблему, поскольку у меня есть настройка, в которой все мои запросы обычно выполняются через sp_executesql.


declare @sql varchar(1000)
set @sql="select * into #t from table;"
set @sql =@sql + "select * from #t;"

 execute  SP_EXECUTESQL  @sql

это сработало для меня

declare @sql nvarchar(max)     
create table #temp ( listId int, Name nvarchar(200))     
set @sql = 'SELECT top 10 ListId, Name FROM [V12-ListSelector].[dbo].[List]'    
insert into #temp
exec sp_executesql  @sql    
select * from #temp    
drop table #temp