2017-07-25 107 views
1

我在t-sql中有一个奇怪的行为。给以下测试奇怪的行为:T-sql字符/字符串连接char

DECLARE @a char(22) = 'John went to buy a car', @b char(15)= 'Tom went to pub'; 
    SELECT IIF(1=1 , @a, @b)+'. He met a friend'; 

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

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

输出错误:

Tom went to pub  . He met a friend. 

变量字符的串联分配22个字符,如果测试结果为真,和22个字符,否则!因此,在通过IIF进行字符串连接(但与CASE相同)的情况下,输出将分配给第一个表达式(@b变量被认为是22个字符!)任何想法?

回答

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居然叫出了固定长度的字符类型,如charvarchar会发生什么,除非我已经错过了它。

+0

谢谢!这是一个很好的答案。 – user1732337