【问题标题】:SQL Server: +(unary) operator on non-numeric StringsSQL Server:非数字字符串上的 +(一元)运算符
【发布时间】:2012-10-24 12:12:37
【问题描述】:

我很惊讶!下面这条语句在SQL SERVER有效:

SELECT  +'ABCDEF'

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

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql sql-server-2012


    【解决方案1】:

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

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

    解释:

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

    (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' 这样的表达式被评估为数字。如果是这样,那为什么这些数字会出现在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) 运算符应用于字符串的目的是什么。我无法想象任何用途!

    更新

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

    After some investigation, this behavior is by design since + is an unary operator. So the parser accepts "+ , and the '+' is simply ignored in this case. Changing this behavior has lot of backward compatibility implications so we don't intend to change it & the fix will introduce unnecessary changes for application code.

    【讨论】:

    • 你是这个意思? “经过一番调查,这种行为是设计使然,因为 + 是一元运算符。因此解析器接受“+ ,并且在这种情况下简单地忽略了 '+'。更改此行为会带来很多向后兼容性的影响,因此我们不打算更改它,并且该修复将为应用程序代码引入不必要的更改。”
    • 是的。这是在您引用的其他回复之后发布的,因此表明至少就 MS 而言,这是“设计使然”而不是错误。该项目以“设计”而非“不会修复”的形式关闭
    • 是的,他们说这是早期版本中的错误,不会在未来版本中修复。我会更新帖子。但是,他们会在我不明白为什么的情况下使用它,例如此处的示例 B:http://msdn.microsoft.com/en-us/library/ms187323.aspx。这就是我遇到问题的地方。
    • 同意示例 B,大概他们不应该包含逗号,或者不打扰前导 +,因为它是多余的。
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多