2010-02-03 11 views
18

Qual è il problema con il seguente SQL. La variabile table table non può essere utilizzata nella clausola JOIN?SQL Server: variabile di tabella utilizzata in un join interno

Il messaggio di errore è "Msg 170, livello 15, stato 1, riga 8 riga 8: sintassi errata vicino a '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) 

Grazie.

risposta

14

Cambia la tua ultima dichiarazione a:

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

(necessario per controllare la sintassi esatta)

3

l'alias t1 è nel posto sbagliato

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

risposta di Justin è corretta sintatticamente - si è necessario assegnare un alias alla tabella temporanea (lo stesso vale per le variabili del tipo di tabella nel 2008).

Tuttavia, si tenga presente che né le variabili di tabella né le variabili di tipo tabella hanno alcuna statistica associata ad esse e, pertanto, può spingere l'ottimizzatore di query a fare scelte molto dubbie riguardo ai piani di esecuzione (perché stimerà sempre che la tabella la variabile contiene 1 riga e pertanto di solito sceglie i cicli annidati come operatore di join).

2

non dimenticare l'uso alias per tabelle delle variabili

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

A parte i alias t1 essere nel posto sbagliato, nessuno altro ha menzionato usando le parentesi quadre attorno al variabile di tabella, invece di un alias. Cambiare la dichiarazione di aggiornamento di seguito si funziona troppo:

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

[Testato su SQL Server 2005.]

+2

in realtà, dopo un tempo di un'occhiata a cercare la sintassi è stata quella che il mi ha aiutato di più. +1 da parte mia per quello. – Hades200621

+1

Questo fa la differenza. – Rolo