Выполните 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