当我运行时
declare @short nchar(1) = '1';
declare @long nchar(5) = '123456';
select 'A' + CASE WHEN 1 = 1 THEN @short ELSE @long END + 'B'
我得到了结果
-------
A1 B
SQL Server似乎正在填充CASE构造的结果,以获得尽可能长的返回值。这只发生在我使用变量时,而不是常量。
奇怪的是,当我明确修剪变量时,结果是正确的,即
select 'A' + CASE WHEN 1 = 1 THEN rtrim(@short) ELSE @long END + 'B'
返回
----
A1B
这种行为是否符合设计,是否可以通过服务器设置关闭?
答案 0 :(得分:0)
当您有CASE
表达式时,数据类型优先级将接管。分支中的所有表达式都将转换为兼容的数据类型。在这种情况下,它必须是NCHAR(5)
,以便它可以适合@short
或@long
。正如您所演示的那样,您可以使用函数影响输出。或者,您可以确保每个可能输出的所有数据类型或相同。或者使用不会导致填充的数据类型(nvarchar
而不是nchar
)。