2013-10-24 80 views
0

当我运行这个SQL Server是填充字符串变量

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服务器似乎被填充的情况下结果构建了尽可能长的返回值。这只发生在我使用变量的时候,而不是常量。

奇怪的是,当我明确地修剪变量,结果是正确的,即

select 'A' + CASE WHEN 1 = 1 THEN rtrim(@short) ELSE @long END + 'B' 

回报

---- 
A1B 

这种行为是由设计,并可以将它通过一台服务器被关闭设置?

+0

不会发生与Varchar,顺便说一句,只是与字符类型。显然,CASE构造被视为具有最长可能长度的char类型。所以我想这是设计。 – cdonner

回答

0

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