SQL Server: табличная переменная, используемая во внутреннем соединении - PullRequest
21 голосов
/ 03 февраля 2010

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

Сообщение об ошибке «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)

Спасибо.

Ответы [ 5 ]

17 голосов
/ 03 февраля 2010

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

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

(необходимо проверить точный синтаксис)

14 голосов
/ 30 апреля 2014

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

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

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

9 голосов
/ 03 февраля 2010

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

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

3 голосов
/ 03 февраля 2010

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

UPDATE
    t1 
SET 
    SportName = @t._SportName
FROM 
    @t INNER JOIN tblSport t1 ON (t1.Lang = @t._Lang)
2 голосов
/ 04 февраля 2013

не забудьте использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...