SQL Server是填充字符串变量

时间:2013-10-24 17:56:56

标签: sql-server-2008 case padding

当我运行时

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

这种行为是否符合设计,是否可以通过服务器设置关闭?

1 个答案:

答案 0 :(得分:0)

当您有CASE表达式时,数据类型优先级将接管。分支中的所有表达式都将转换为兼容的数据类型。在这种情况下,它必须是NCHAR(5),以便它可以适合@short@long。正如您所演示的那样,您可以使用函数影响输出。或者,您可以确保每个可能输出的所有数据类型或相同。或者使用不会导致填充的数据类型(nvarchar而不是nchar)。