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运算符?
这是我对这个问题的回答(也请参阅最后的更新):
不,在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'是按数字求值的结论。如果是这样,那为什么这些数字可以在字符串相关的功能,如出现DATALENGTH,LEN等你能看到的一份声明这样的代码:
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)运算符应用于字符串的目的是什么。我无法想象任何用法!
更新
它说这是早期版本中的一个错误,但由于向后兼容而无法修复:
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |