2010-02-03 7 views
18

Was ist das Problem mit SQL, das folgt. Kann die Tabellenvariable nicht in der JOIN-Klausel verwendet werden?SQL Server: Tabellenvariable, die in einem inneren Join verwandt wird

Fehler msg ist "Msg 170, Ebene 15, Status 1, Zeile 8 Zeile 8: Falsche Syntax in der Nähe von '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) 

Danke.

Antwort

14

Ändern Sie Ihre letzte Aussage zu:

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

(müssen genaue Syntax überprüfen)

3

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) 
8

Justins Antwort richtig syntaktisch - Sie müssen Sie der temporären Tabelle einen Alias ​​zuweisen (dasselbe gilt für die Variablen des Tabellentyps in 2008).

Beachten Sie jedoch, dass weder für Tabellenvariablen noch für Variablen der Tabelle eine Statistik zugeordnet ist. Daher kann der Abfrageoptimierer sehr dubiose Entscheidungen in Bezug auf Ausführungspläne treffen (da die Tabelle immer geschätzt wird) Variable enthält 1 Zeile - und wählt daher normalerweise verschachtelte Schleifen als Join-Operator.

2

vergessen Sie nicht verwenden 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) 
10

Neben den t1 alias an der falschen Stelle zu sein, sonst niemand eckigen Klammern erwähnt um die Tabellenvariable, statt eines Pseudonyms gestattet. Auch die Änderung der Update-Anweisung auf die folgende funktioniert:

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

[Getestet auf SQL Server 2005]

+2

tatsächlich, nach einem Blick Zeit mit der Suche Ihre Syntax war derjenige der mir am meisten geholfen. +1 von mir dafür. – Hades200621

+1

Dieser macht den Unterschied. – Rolo

Verwandte Themen