Подтвердить что ты не робот

SQL Server: переменная таблицы, используемая во внутреннем соединении

В чем проблема со следующим SQL. Может ли переменная таблицы не использоваться в предложении JOIN?

Ошибка msg имеет значение "Msg 170, уровень 15, состояние 1, строка 8 строка 8: неправильный синтаксис рядом с" 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)

Спасибо.

4b9b3361

Ответ 1

Измените свой последний оператор на:

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

(нужно проверить точный синтаксис)

Ответ 2

Кроме того, что псевдоним t1 находится не в том месте, никто не упомянул об использовании квадратных скобок вокруг переменной таблицы вместо псевдонима. Также будет изменено изменение оператора обновления на следующее:

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

[Протестировано на SQL Server 2005.]

Ответ 3

Ответ Justin корректно синтаксически - вам нужно назначить псевдоним для таблицы temp (такой же для переменных типа таблицы в 2008 году).

Однако имейте в виду, что ни переменные таблицы, ни переменные таблицы не имеют какой-либо статистики, связанной с ними, и поэтому могут заставить оптимизатор запросов сделать очень сомнительный выбор в отношении планов выполнения (поскольку он всегда будет оценивать, что переменная таблицы содержит 1 строку - и поэтому обычно выбирает вложенные петли в качестве оператора объединения).

Ответ 4

Ваш псевдоним t1 находится не в том месте

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

Ответ 5

не забывайте использовать 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)