SQL Server:非数字字符串上的+(一元)运算符

RGO*_*RGO 3 sql t-sql sql-server sql-server-2008 sql-server-2012

我很惊讶!以下声明适用于SQL SERVER

SELECT  +'ABCDEF'
Run Code Online (Sandbox Code Playgroud)

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

RGO*_*RGO 5

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

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

说明:

给定的语句有效,并产生以下结果:

(No column name) 
----------------
ABCDEF
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

这等效于SELECT不使用+符号就执行语句:

SELECT  'ABCDEF'
Run Code Online (Sandbox Code Playgroud)

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

也许,此运算符可以成功接受那些已成功评估为数字的字符串值,例如已在此处使用的数字:

SELECT  +'12345'+1
Run Code Online (Sandbox Code Playgroud)

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

(No column name) 
----------------
12346
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

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

首先,如果我们接受这种解释是正确的,那么我们可以得出这样的表达式+'12345'是按数字求值的结论。如果是这样,那为什么这些数字可以在字符串相关的功能,如出现DATALENGTHLEN等你能看到的一份声明这样的代码:

  SELECT  DATALENGTH(+'12345')
Run Code Online (Sandbox Code Playgroud)

非常有效,结果如下:

 (No column name) 
----------------
5
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

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

其次,虽然与-运算符类似的语句,例如:

 `SELECT  -'ABCDE'` 
Run Code Online (Sandbox Code Playgroud)

甚至这个:

`SELECT  -'12345'` 
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

Invalid operator for data type. Operator equals minus, type equals varchar.
Run Code Online (Sandbox Code Playgroud)

为什么+在非数字字符串值错误地使用了运算符的情况下,它不会为类似情况生成错误?

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

当我们看到没有为这样的语句生成错误时,该问题看起来会更加严重:

SELECT ++++++++'ABCDE'
Run Code Online (Sandbox Code Playgroud)

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

更新

它说这是早期版本中的一个错误,但由于向后兼容而无法修复:

经过一些调查,由于+是一元运算符,因此此行为是设计使然。因此,解析器接受“ +,在这种情况下,'+'会被忽略。更改此行为会向后兼容,因此我们不打算对其进行更改,并且此修复程序将对应用程序代码进行不必要的更改。

  • 根据 https://connect.microsoft.com/SQLServer/feedback/details/718176/concatenation-operator-not-working-properly,字符串上有一个一元运算符 (2认同)