为什么算术+优先于文本?

时间:2016-10-12 17:36:27

标签: sql-server

如果我跑

select '1' + '1'

结果是11,因为我已经将文本添加到另一个。

如果我跑

select 1 + '1'

结果是2.我假设因为第一个操作数的类型而选择算术运算符而不是连接符。如果我的推理有效,那么

的结果
select '1' + 1

将是11.但相反,它是2.因此,似乎运算符+被尝试用作算术运算符,如果两个操作数都不是算术运算符,则继续运行到下一个运算符。如果这是真的,那就可以解释为什么我会得到

的错误
  

将varchar值'customer_'转换为数据类型时转换失败   中间体

当我运行customer_<somenumber>时,

而不是select and had 'customer_' + <somenumber>

长话短说:我认为我发现算术+优于SQL Server连接的意义。我对吗?如果是这样,这种行为是否有官方原因?

2 个答案:

答案 0 :(得分:3)

您遇到的问题是data type precedence。 SQL Server在数字后查找字符数据类型。因此,无论操作数的顺序如何(1 + '1' vs '1' + 1),它都会尝试将您的类型转换为数字并成功。

第二次尝试也是如此 - 它试图将字符串customer_转换为整数,因为你正在使用算术运算符和整数。

答案 1 :(得分:2)

是的,与串联相比,优先级是算术。

https://msdn.microsoft.com/en-us/library/ms190276.aspx

正如您所知,您的错误是因为它不会隐式尝试将INT转换为VARCHAR