Jeśli uruchomię ten dynamiczny zapytanie:

declare @test nvarchar(1000) = 'select * into #tmp7 from bauser'
execute(@test)

A następnie spróbuj zapytać #tmp7 z:

select * from #tmp7

Błąd jest rzucony:

Nieprawidłowa nazwa obiektu '# TMP7'.

Jednak jeśli ręcznie uruchomię te same zapytanie:

select * into #tmp7 from bauser

Wszystko w porządku. Tabela tymczasowa jest tworzona i wypełniona wyników.

Dlaczego nie działa z dynamicznym wykonaniem zapytania?

2
FrenkyB 16 luty 2017, 20:41

2 odpowiedzi

Najlepsza odpowiedź

ZAKRES!

Tabela tymczasowa istnieje tylko w zakresie dynamicznego wykonanego zapytania, jeśli chcesz, aby wybrać umieścić go wewnątrz dynamicznego zapytania

declare @test nvarchar(1000) = 'select * into #tmp7 from bauser

select * from #tmp7'
execute(@test)

Możesz także sprawdzić, czy taki obiekt istnieje, używając tego

select * from sys.sysobjects so where so.name like '%tmp7%'

Zobacz podobne pytanie SQL Server 2005 i tymczasowy zakres tabeli

Edytuj

Tabela Temp jest tabelą, więc tak, można dodać kolumny, indeksy itp. Tabele znajdują się w rzeczywistości w bazie danych TEMPDB, a nawet znajdź "je (można je zobaczyć z dziwnymi długimi nazwami), ale są one zniszczone po Wykonanie swojego exec.

Może twój problem polega na wypróbowaniu podejścia dynamicznego lub nie jest w ogóle związane z pytaniem. Spróbuj opublikować nowe pytanie, co masz i co musisz zrobić, aby uzyskać dalszą pomoc.

5
Community 23 maj 2017, 12:16

Jeśli tworzysz tabelę TEMP za pomocą dynamicznego SQL, nie będzie dostępny poza dynamicznym zakresem SQL.

Musisz go utworzyć z dynamicznego SQL, a następnie użyj INSERT INTO, aby wypełnić tabelę.

-- use this trick to create the temp table easily.
SELECT * INTO #tmp7
FROM bauser
WHERE 1=2

declare @test nvarchar(1000) = 'insert into #tmp7 select * from bauser'
execute(@test)
1
FLICKER 16 luty 2017, 19:17