2017-07-25 139 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