2013-08-01 15 views
22

ich versuche zu erreichen:SQL temporäre Tabelle Variable

entstehen
declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

SELECT * FROM @TEMP 
WHERE @TEMP.ID = 1  <--- ERROR AT @TEMP.ID 

ABER ein Fehler

muss die skalare Variable "@temp" deklarieren.

Hilfe?

+3

'SELECT * FROM @TEMP T WHERE T.ID = 1' – GriGrim

Antwort

26

Ein Tabellenalias kann nicht mit @ beginnen. Also, geben @Temp einen anderen Aliasnamen (oder lassen Sie die zweiteilige Benennung insgesamt):

SELECT * 
FROM @TEMP t 
WHERE t.ID = 1; 

Auch ein einzelnes Gleichheitszeichen traditionell für einen Vergleich in SQL verwendet wird.

10

Entweder verwenden Sie ein Allias in der Tabelle wie T und verwenden T.ID, oder verwenden Sie nur den Spaltennamen.

7

Wenn Sie das @ umklammern können Sie es direkt

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp values (1,'one'), (2,'two') 

SELECT * FROM @TEMP 
WHERE [@TEMP].[ID] = 1 
3

Es gibt eine andere Methode der temporären Tabelle

create table #TempTable (
ID int, 
name varchar(max) 
) 

insert into #TempTable (ID,name) 
Select ID,Name 
from Table 

SELECT * 
FROM #TempTable 
WHERE ID = 1 

sicher, dass Sie sind die richtige Datenbank auswählen.

-4

Sie haben @TEMP deklariert, aber in Ihrer Insert-Anweisung @temp verwendet. Groß-/Kleinschreibung von Variablennamen

ändern @temp @TEMP

+2

Bei Variablen wird NICHT zwischen Groß- und Kleinschreibung unterschieden. –

-1

In Bezug auf die üblichen Parameter im Gegensatz, die mit einem ‚@‘ (z @parameter) beginnen, temporäre Tabellen müssen mit einem # (z #tempTable) starten. Wie GauravSetia vorschlägt, sollten Sie Ihre temporäre Tabelle wie eine normale Tabelle deklarieren, aber benennen Sie sie mit einem # anstelle von einem @, und sie wird nur in Ihrer aktuellen Sitzung verfügbar sein und wird beim Schließen der Sitzung gelöscht. Sie können auch eine globale temporäre Tabelle haben, die mit ## beginnt (z. B. ## globalTempTable), die für Sitzungen verwendet werden kann und beim Schließen der Sitzung, in der sie erstellt wurde, jedoch noch nicht verwendet wurde.

+1

Es gibt tatsächlich Tabellenvariablen sowie temporäre Tabellen.Es gibt Zeiten, in denen sie vorzuziehen sind und Zeiten, in denen temporäre Tabellen vorzuziehen sind. Temp-Tabellen können indiziert werden und sind für große Datasets besser geeignet. Tabellenvariablen sind bei kleinen Datensätzen oft schneller und werden häufig in gespeicherten Prozeduren für SSIS-Quellziele verwendet, wenn die Abfrage zum Abrufen der Daten komplex ist, da SSIS die Spalten nicht ermitteln kann, wenn Sie eine temporäre Tabelle verwenden. Tabellenvariablen sind erforderlich, wenn Sie nach einem Rollback einige Daten beibehalten möchten, z. B. die Daten, die Sie eingefügt haben und die den Fehler verursacht haben. – HLGEM

+0

Oh, Entschuldigung! Danke, dass du es eingefangen hast: Ich werde sicherstellen, dass ich weiß, wovon ich rede, bevor ich das nächste Mal antworte. –

0

Sie sollten Hash (#) -Tabellen verwenden, nach denen Sie tatsächlich suchen, weil der Wert der Variablen nur bis zur Ausführung erhalten bleibt. z.B. -

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

Wenn über zwei und unter zwei Anweisungen separat ausgeführt werden.

SELECT * FROM @TEMP 
WHERE @TEMP.ID = 1 

Der Fehler wird angezeigt, weil der Wert der Variablen verloren geht, wenn Sie den Stapel der Abfrage zum zweiten Mal ausführen. Es gibt definitiv o/p, wenn Sie einen ganzen Block von Code ausführen.

Die Hash-Tabelle ist die bestmögliche Option zum Speichern und Abrufen des temporären Werts. Es dauert lange, bis die Elternsitzung am Leben ist.

Verwandte Themen