26 Stimmen

SQL Server: Tabellenvariable in einer inneren Verknüpfung verwendet

Was ist das Problem mit dem folgenden SQL. Kann eine Tabellenvariable nicht in einer JOIN-Klausel verwendet werden? ?

Die Fehlermeldung lautet "Msg 170, Level 15, State 1, Line 8 Line 8: Incorrect syntax near 't1'."

Declare @t TABLE (
    _SportName  varchar(50),
    _Lang       varchar(3)
)

insert @t VALUES('Basketball', 'ENG') -- ENG

UPDATE tblSport t1 
SET 
    t1.SportName = @t._SportName
FROM 
    @t INNER JOIN tblSport ON (t1.Lang = @t._Lang)

Gracias.

23voto

Justin Niessner Punkte 235353

Ändern Sie Ihre letzte Aussage in:

UPDATE t1, temp
SET t1.SportName = temp._SportName
FROM tblSport AS t1
INNER JOIN @t AS temp
    ON t1.Lang = temp._Lang

(genaue Syntax muss geprüft werden)

18voto

takrl Punkte 6288

Abgesehen davon, dass der Alias t1 an der falschen Stelle steht, hat niemand erwähnt, dass die Tabellenvariable in eckige Klammern gesetzt werden muss, anstatt einen Alias zu verwenden. Wenn Sie die Aktualisierungsanweisung wie folgt ändern, funktioniert das auch:

UPDATE t1
SET
    t1.SportName = [@t]._SportName
FROM
    @t INNER JOIN tblSport t1 ON t1.Lang = [@t]._Lang

(Getestet auf SQL Server 2005.)

9voto

Matt Whitfield Punkte 6258

Justins Antwort ist syntaktisch korrekt - Sie müssen der temp-Tabelle einen Alias zuweisen (dasselbe gilt für Variablen vom Typ Tabelle in 2008).

Beachten Sie jedoch, dass weder Tabellenvariablen noch tabellenartige Variablen mit Statistiken verknüpft sind und daher den Abfrageoptimierer dazu veranlassen können, sehr zweifelhafte Entscheidungen in Bezug auf Ausführungspläne zu treffen (da er immer davon ausgeht, dass die Tabellenvariable eine Zeile enthält - und daher normalerweise verschachtelte Schleifen als Verknüpfungsoperator wählt).

2voto

gbn Punkte 407102

Ihr Alias t1 ist an der falschen Stelle

UPDATE
    t1 
SET 
    SportName = @t._SportName
FROM 
    @t INNER JOIN tblSport t1 ON (t1.Lang = @t._Lang)

2voto

Serjik Punkte 9789

Nicht vergessen zu benutzen alias für variable Tabellen

Declare @t TABLE (
    _SportName  varchar(50),
    _Lang       varchar(3)
)

insert @t VALUES('Basketball', 'ENG') -- ENG

UPDATE t1 
SET 
    t1.SportName = t2._SportName
FROM tblSport t1 INNER JOIN
    @t as t2  ON (t1.Lang = t2._Lang)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X