为什么T-SQL ISNULL()截断字符串而COALESCE不是?

时间:2013-09-19 02:16:33

标签: sql-server tsql coalesce isnull truncation

鉴于以下内容:

SELECT ISNULL('XY' + NULL, 'ABCDEFGHIJ') -- Outputs ABC (Why?)
SELECT COALESCE('XY' + NULL, 'ABCDEFGHIJ') -- Outputs ABCDEFGHIJ

为什么这些陈述会返回不同的结果?

3 个答案:

答案 0 :(得分:15)

根据Microsoft documentation,功能:

ISNULL(check_expression, replacement_value)

replacement_value必须属于可隐式转换为check_expression类型的类型。请注意'xy'+NULL的类型为VARCHAR(3)。因此,您的字符串'ABCDEFGHIJ'会转换为VARCHAR(3),从而进行修剪。

听起来很奇怪为什么它不是VARCHAR(2),但这就是它的方式 - 比'xy'长一个字符。您可以使用此 SQLFiddle 进行播放,并亲眼看看'xy'+NULL的类型与CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END的表达式相同,即NULL,但是与VARCHAR(3)隐式兼容。

对于表达式'xy'+NULL,似乎可以将感知长度计算为'xy'字符串长度(2)加上每添加NULL的1。例如,'xy'+NULL+NULL的类型为VARCHAR(4)'xy'+NULL+NULL+NULL的类型为VARCHAR(5),依此类推 - 请查看此 SQLFiddle 。这非常奇怪,但这就是MS SQL Server 2008和2012的工作方式。

答案 1 :(得分:4)

答案 2 :(得分:0)

ISNULL()将替换值转换为检查表达式的类型。在这种情况下,检查表达式的类型为CHAR(2),因此转换替换值会截断它(您确定要获得ABC而不只是AB吗?)。

来自Microsoft documentation

  如果replacement_value超过replacement_value,则

check_expression会被截断。