我很惊讶!以下声明在以下情况下有效SQL SERVER
:
SELECT +'ABCDEF'
是否已SQL Server
定义为字符串类型+
的运算符?Unary
我很惊讶!以下声明在以下情况下有效SQL SERVER
:
SELECT +'ABCDEF'
是否已SQL Server
定义为字符串类型+
的运算符?Unary
这是我自己对这个问题的回答(另请参阅最后的更新):
不,字符串表达式上没有定义这样的一元运算符。这可能是一个错误。
解释:
给定的语句是有效的,它会生成以下结果:
(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'
被评估为数字。如果是这样,那么为什么这些数字会出现在字符串相关的函数中,例如DATALENGTH
,LEN
等。您可以看到这样的语句:
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)
应用于字符串的运算符的目的是什么。我无法想象任何用途!
更新
这里它说这是早期版本中的一个错误,但由于向后兼容性,它不会被修复: