【发布时间】:2012-10-24 12:12:37
【问题描述】:
我很惊讶!下面这条语句在SQL SERVER有效:
SELECT +'ABCDEF'
SQL Server 是否已将 + 定义为字符串类型的 Unary 运算符?
【问题讨论】:
标签: sql sql-server sql-server-2008 tsql sql-server-2012
我很惊讶!下面这条语句在SQL SERVER有效:
SELECT +'ABCDEF'
SQL Server 是否已将 + 定义为字符串类型的 Unary 运算符?
【问题讨论】:
标签: sql sql-server sql-server-2008 tsql sql-server-2012
这是我自己对这个问题的回答(另请参阅最后的更新):
不,字符串表达式上没有定义这样的一元运算符。这可能是一个错误。
解释:
给定的语句是有效的,它会产生以下结果:
(No column name)
----------------
ABCDEF
(1 row(s) affected)
这相当于在不使用+ 符号的情况下执行SELECT 语句:
SELECT 'ABCDEF'
编译时没有给出任何错误,实际上是成功执行,给人的印象是+ 正在作为Unary 对给定字符串进行操作。但是,在T-SQL 官方文档中,并没有提到这样的操作符。实际上,在题为“String Operators”的部分,+出现在两个String操作中,分别是+ (String Concatenation)和+= (String Concatenation);但Unary 操作也不是。此外,在标题为“Unary Operators”的部分中,介绍了三个运算符,其中只有一个是 + (Positive) 运算符。然而,对于这唯一一个似乎相关的,很快就会清楚这个运算符也与非数字字符串值无关,因为+ (Positive) 运算符的解释明确指出该运算符仅适用于数字值:“Returns the value of a numeric expression (a unary operator)”。
也许,这个操作符可以成功地接受那些被成功评估为数字的字符串值,比如这里使用的那个:
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) 运算符应用于字符串的目的是什么。我无法想象任何用途!
更新
这里说这是早期版本中的一个错误,但由于向后兼容性,它不会被修复:
【讨论】:
+,因为它是多余的。