Правильно

select @NewValue=(  select *  from inserted for xml path(''))

Ошибка

select @NewValue=select *  from inserted for xml path('')

Версия SQL Server: 2016

-3
andrew2558 22 Ноя 2019 в 12:32
2
Я предполагаю, что это просто выбор дизайна, не более и не менее
 – 
HoneyBadger
22 Ноя 2019 в 12:33
5
Вы спрашиваете, почему грамматика требует использования скобок? Вероятно, потому, что, учитывая сложность общего оператора select и тот факт, что операторы в SQL могут занимать несколько строк и не должны заканчиваться точкой с запятой, отсутствие круглых скобок может создать двусмысленность.
 – 
GSerg
22 Ноя 2019 в 12:38
У вас не может быть SELECT в таком SELECT. Это было бы похоже на SELECT MyColumn1 = SELECT MyCol FROM dbo.MyTable, MyColum2 = SELECT OtherCol FROM dbo.MyTable;. Это не имеет смысла.
 – 
Larnu
22 Ноя 2019 в 12:59

1 ответ

Вас может смутить тот факт, что в таких выражениях, как 1 + 2 * 3, круглые скобки необязательны (если только вам не нужно переопределить приоритет стандартных операторов).

SELECT @NewValue = 1 + 2 * 3

SELECT @NewValue = (1 + 2) * 3

Но SELECT * FROM inserted FOR XML PATH('') не является выражением; это утверждение. Во многих формальных языках оператор не принадлежит выражению, но SQL любезно предлагает вам возможность вызывать заключенные в скобки операторы SELECT в виде выражений.

Как отмечают другие, круглые скобки являются дизайнерским решением в определении синтаксиса SQL. Вероятно, мудрое дизайнерское решение; начало оператора SELECT всегда ясно, но конец оператора обычно неоднозначен. Пример:

SELECT @NewValue = 2 * SELECT Foo FROM Bar WHERE Baz = 1 + 3

Это можно интерпретировать либо как:

SELECT @NewValue = 2 * SELECT Foo FROM Bar WHERE Baz = (1 + 3)

Или (поскольку * имеет приоритет над +):

SELECT @NewValue = (2 * SELECT Foo FROM Bar WHERE Baz = 1) + 3

При написании синтаксического анализатора это незавершенные вопросы, которые вам не нужны в определении вашего языка.

1
Ruud Helderman 22 Ноя 2019 в 13:43