我在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个字符!)任何想法?
答案 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}除非我错过了它。