4

我很惊讶!以下声明在以下情况下有效SQL SERVER

SELECT  +'ABCDEF'

是否已SQL Server定义为字符串类型+的运算符?Unary

4

1 回答 1

6

这是我自己对这个问题的回答(另请参阅最后的更新):

不,字符串表达式上没有定义这样的一元运算符。这可能是一个错误。

解释:

给定的语句是有效的,它会生成以下结果:

(No column name) 
----------------
ABCDEF
(1 row(s) affected)

这相当于在SELECT不使用+符号的情况下执行语句:

SELECT  'ABCDEF'

编译时没有给出任何错误,实际上是成功执行,给人的印象+Unary对给定字符串的操作。但是,在官方T-SQL文档中,并没有提到这样的操作符。实际上,在标题为“字符串运算符”的部分中,+出现了两个字符串操作,它们是+ (String Concatenation)+= (String Concatenation); 但也不是Unary手术。此外,在标题为“一元运算符”的部分中,已经介绍了三个运算符,其中只有一个是+ (Positive)运算符。然而,对于这唯一一个似乎相关的,很快就会清楚的是,这个运算符也与非数字字符串值无关,因为它的解释+ (Positive)运算符明确指出此运算符仅适用于数值:“返回数值表达式的值(一元运算符) ”。

也许,这个运算符可以成功地接受那些被成功评估为数字的字符串值,例如这里使用的那个:

SELECT  +'12345'+1

执行上述语句时,它会在输出中生成一个数字,该数字是作为数字评估的给定字符串和添加到它的数字值的总和,这在1这里但显然可以是任何其他数量:

(No column name) 
----------------
12346
(1 row(s) affected)

但是,我怀疑这种解释是否正确,因为它引发了以下问题:

首先,如果我们接受这种解释是正确的,那么我们可以得出结论,这样的表达式+'12345'被评估为数字。如果是这样,那么为什么这些数字会出现在字符串相关的函数中,例如DATALENGTHLEN等。您可以看到这样的语句:

  SELECT  DATALENGTH(+'12345')

是非常有效的,结果如下:

 (No column name) 
----------------
5
(1 row(s) affected)

这意味着+'12345'被评估为字符串而不是数字。这怎么解释?

其次,while 语句与-运算符类似,例如:

 `SELECT  -'ABCDE'` 

甚至这个:

`SELECT  -'12345'` 

产生以下错误:

Invalid operator for data type. Operator equals minus, type equals varchar.

+为什么,当运算符被错误地与非数字字符串值一起使用时,它不应该在类似情况下产生错误吗?

因此,这两个问题使我无法接受这样的解释,即这是在+ (unary)数值文档中引入的同一运算符。由于在其他任何地方都没有提到它,因此它可能是故意添加到语言中的。可能是一个错误。

当我们看到没有为诸如以下语句生成错误时,问题看起来更加严重:

SELECT ++++++++'ABCDE'

我不知道是否有任何其他编程语言可以接受这些陈述。但是如果有的话,很高兴知道他们使用+ (unary)应用于字符串的运算符的目的是什么。我无法想象任何用途!

更新

这里它说这是早期版本中的一个错误,但由于向后兼容性,它不会被修复:

经过一番调查,这种行为是设计使然,因为 + 是一元运算符。因此解析器接受 "+ ,并且在这种情况下简单地忽略了 '+'。更改此行为具有很多向后兼容性的含义,因此我们不打算更改它并且该修复程序将为应用程序代码引入不必要的更改。

于 2012-11-04T13:25:57.057 回答