【问题标题】:The problem of assigning values to variables in SQL Server [closed]SQL Server中为变量赋值的问题[关闭]
【发布时间】:2019-11-22 09:32:05
【问题描述】:

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

错误

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

SQL Server 版本:2016

【问题讨论】:

  • 我猜这只是一个设计选择,仅此而已
  • 你在问为什么语法需要使用括号?可能是因为,鉴于一般select 语句的复杂性以及 SQL 中的语句可以跨越多行且不必以分号结尾的事实,缺少括号会造成歧义。
  • 你不能像这样在SELECT 中拥有SELECT。这就像拥有SELECT MyColumn1 = SELECT MyCol FROM dbo.MyTable, MyColum2 = SELECT OtherCol FROM dbo.MyTable; 这没有意义。

标签: sql-server sql-server-2016


【解决方案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

在编写解析器时,这些是您在语言定义中想要的松散端。

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 2018-06-13
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2014-10-31
    • 1970-01-01
    • 2018-03-13
    相关资源
    最近更新 更多