0

当我运行这个

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

这种行为是设计使然,可以通过服务器设置将其关闭吗?

4

1 回答 1

0

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

于 2013-10-24T18:07:46.953 回答