奇怪的行为:T-sql char / string连接char

时间:2017-07-25 09:45:15

标签: string tsql string-concatenation

我在t-sql中有一个奇怪的行为。进行以下测试

   SELECT IIF(1=2 , @a, @b )+'. He met a friend';

输出正常:        约翰去买车。他遇到了一位朋友。

    Tom went to pub       . He met a friend.

输出错误:

libsdl-gfx1.2-dev libsdl-image1.2-dev libsdl1.2-dev

如果test为true,则变量char的串联分配22个字符,否则分配22个字符!因此在通过IIF的char连接中(但CASE也是如此)输出被分配给第一个表达式(@b变量被认为是22个字符!)任何想法?

1 个答案:

答案 0 :(得分:1)

IIF表达式,因此需要数据类型。此数据类型不能取决于执行时发生的情况 - 需要在查询编译时知道。

因此,假设两个输入是char(22)char(15),则T-SQL为表达式选择的数据类型作为一个整体是'更宽“这两者中,更具包容性 - 即char(22)

因此,无论执行时间结果如何,结果的类型都将为char(22)。正如您所观察到的,这意味着有时候结果与所选输入相比是空间填充的。

有趣的是,我实际上无法在the documentation for IIF中的任何地方明确地发现这种行为。它说那里

  

从true_value和false_value中的类型返回具有最高优先级的数据类型。有关详细信息,请参阅Data Type Precedence (Transact-SQL)

但是 linked page on Precedence 实际上没有调出固定长度字符类型的内容,例如char和{{1}除非我错过了它。