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

Какова проблема со следующим SQL. Разве табличная переменная не может использоваться в пункте СОЕДИНЕНИЯ?

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

Спасибо.

22
задан OMG Ponies 3 February 2010 в 04:07
поделиться

3 ответа

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

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

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

18
ответ дан 29 November 2019 в 04:26
поделиться

Ваше псевдоним T1 не в том месте

UPDATE
    t1 
SET 
    SportName = @t._SportName
FROM 
    @t INNER JOIN tblSport t1 ON (t1.Lang = @t._Lang)
3
ответ дан 29 November 2019 в 04:26
поделиться

Не следует переносить элементы/теги блоков (например, < div > ) в встроенные тэги (например, < a > ). Это требует неприятностей.

-121--4213410-

Именно так работают перечисления в .NET. Перечисление не является ограничительным набором значений, это действительно просто набор имен для чисел (и тип, чтобы собрать эти имена вместе) - и я согласен, что иногда это боль.

Если необходимо проверить, действительно ли значение определено в перечислении, можно использовать Enum.IsDefined после анализа. Если вы хотите сделать это более безопасным способом, вы можете посмотреть на мой проект Unconstrained Melody , который содержит множество ограниченных общих методов.

-121--2476999-

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

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

9
ответ дан 29 November 2019 в 04:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: