2010-02-03 32 views
18

Quel est le problème avec SQL suivant. La variable de table Can ne peut-elle pas être utilisée dans la clause JOIN? L'erreur msg est de "Msg 170, niveau 15, état 1, ligne 8 ligne 8: syntaxe incorrecte près de" t1 "."SQL Server: variable de table utilisée dans une jointure interne

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) 

Merci.

Répondre

14

Changer votre dernière déclaration:

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

(besoin de vérifier la syntaxe exacte)

3

Votre alias t1 est au mauvais endroit

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

La réponse de Justin est correcte syntaxiquement - vous besoin d'affecter un alias à la table temporaire (même chose pour les variables de type table en 2008). Cependant, sachez que les variables de table et les variables de type table ne sont associées à aucune statistique, ce qui peut amener l'optimiseur de requêtes à faire des choix très douteux en ce qui concerne les plans d'exécution (car il estimera toujours que la table variable contient 1 ligne - et choisit donc généralement des boucles imbriquées en tant qu'opérateur de jointure).

2

ne pas oublier l'utilisation alias pour les tables variables

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

En dehors de l'alias t1 étant au mauvais endroit, personne d'autre a mentionné en utilisant des crochets autour de la variable de table, au lieu d'un alias. Modification de la déclaration de mise à jour à ce qui suit fonctionnera aussi:

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

[Testé sur SQL Server 2005.]

+2

fait, après un temps de regarder la recherche de votre syntaxe est celui qui me l'a aidé le plus. +1 de moi pour ça. – Hades200621

+1

Celui-ci fait la différence. – Rolo