2013-10-24 74 views
0

當我運行這個SQL Server是填充字符串變量

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服務器似乎被填充的情況下結果構建了儘可能長的返回值。這隻發生在我使用變量的時候,而不是常量。

奇怪的是,當我明確地修剪變量,結果是正確的,即

select 'A' + CASE WHEN 1 = 1 THEN rtrim(@short) ELSE @long END + 'B' 

回報

---- 
A1B 

這種行爲是由設計,並可以將它通過一臺服務器被關閉設置?

+0

不會發生與Varchar,順便說一句,只是與字符類型。顯然,CASE構造被視爲具有最長可能長度的char類型。所以我想這是設計。 – cdonner

回答

0

當您有一個CASE表達式時,數據類型優先級將會接管。分支中的所有表達式都將轉換爲兼容的數據類型。在這種情況下,它需要是NCHAR(5),以便它可以適合@short@long。您可以在之後影響輸出,正如您已經證明的那樣,使用函數。或者你可以確保每個可能的輸出或相同的所有數據類型。或者使用不引起填充的數據類型(nvarchar而不是nchar)。