2010-02-03 23 views
18

¿Cuál es el problema con el siguiente SQL? ¿Puede la variable de tabla no usarse en la cláusula JOIN?Servidor SQL: variable de tabla utilizada en una unión interna

El mensaje de error es de "Msg 170, nivel 15, estado 1, línea 8 Línea 8: sintaxis incorrecta cerca de '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.

Respuesta

14

Cambie su última declaración a:

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

(que comprobar la sintaxis exacta)

3

Su alias t1 está en el lugar equivocado

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

respuesta de Justin es sintácticamente correcto - se es necesario asignar un alias a la tabla temporal (lo mismo para las variables de tipo de tabla en 2008).

Sin embargo, tenga en cuenta que ni las variables de tabla ni las variables de tabla tienen estadísticas asociadas, por lo que el optimizador de consultas puede tomar decisiones muy dudosas con respecto a los planes de ejecución (porque siempre estimará que la tabla la variable contiene 1 fila y, por lo tanto, generalmente elige bucles anidados como operador de unión).

2

no se olvide el uso de tablas de variables alias

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

Aparte de los alias de t1 estar en el lugar equivocado, nadie más ha mencionado el uso de corchetes alrededor de la variable de tabla, en lugar de un alias. Cambio de la instrucción de actualización a la siguiente también funcionará:

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

[Probado en SQL Server 2005.]

+2

realidad, después de un tiempo buscando en el aspecto de sintaxis fue el del más me ayudó. +1 de mí por eso. – Hades200621

+1

Este hace la diferencia. – Rolo

Cuestiones relacionadas