這個問題源於csdn一貼子,後來發現sql server各版本對這個case when else end結果的處理不盡相同。。
CASE文法如下:/**//*
CASE input_expression
WHEN when_expression THEN result_expression
[ n ]
[
ELSE else_result_expression
]
END
Searched CASE function:
CASE
WHEN Boolean_expression THEN result_expression
[ n ]
[
ELSE else_result_expression
]
END
*/
聯機文檔有文:結果類型:從 result_expressions 和可選 else_result_expression 的類型集中返回優先順序最高的類型。
有關詳細資料,請參閱 資料類型優先順序,如下/**//*
SQL Server uses the following precedence order for data types:
1. user-defined data types (highest)
2. sql_varian t
3. xml
4. datetimeoffset
5. datetime2
6. datetime
7. smalldatetime
8. date
9. time
10. float
11. real
12. decimal
13. money
14. smallmoney
15. bigint
16. int
17. smallint
18. tinyint
19. bit
20. ntext
21. text
22. image
23. timestamp
24. uniqueidentifier
25. nvarchar (including nvarchar(max) )
26. nchar
27. varchar (including varchar(max) )
28. char
29. varbinary (including varbinary(max) )
30. binary (lowest)
*/
下面準備測試資料及開始測試:
declare @T Table (id char(10))
insert into @T select '1'
insert into @T select '2'
insert into @T select '3'
--顯示指定結果為char類型,長度為10,可以看到case後的result類型為char,沒有變化。
select case id when '3'Then cast('' as char(10)) else id end as Id,
SQL_VARIANT_PROPERTY((case id when '3'Then cast('' as char(10)) else id end),'BaseType') as CaseResultType,
case id when '3'Then DataLength(cast('' as char(10))) else DataLength(ID) end as IDDataLength
from @T
/**//*
Id CaseResultType IDDataLength
1 char 10
2 char 10
char 10
*/
--不顯示指定類型,那麼''則為varchar型,根據聯機文檔case的result類型優先順序varchar優先char,
--可以看到case後的result類型為varchar。
select case id when '3'Then '' else id end as Id,
SQL_VARIANT_PROPERTY((case id when '3'Then '' else id end),'BaseType') as CaseResultType,
case id when '3'Then DataLength('') else DataLength(ID) end as IDDataLength
from @T
/**//*
Id CaseResultType IDDataLength
1 varchar 10
2 varchar 10
varchar 0
*/
--不顯示指定類型,那麼4則為int型,根據聯機文檔case的result類型優先順序int優先char,
--可以看到case後的result類型為int型,但儲存大小不全是4。
select case id when '3'Then 4 else id end as Id,
SQL_VARIANT_PROPERTY((case id when '3'Then 4 else id end),'BaseType') as CaseResultType,
case id when '3'Then DataLength(4) else DataLength(ID) end as IDDataLength
from @T
/**//*
Id CaseResultType IDDataLength
1 int 10
2 int 10
4 int 4
*/
我以上的測試環境是
Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) Mar 29 2009 10:27:29 Copyright (c) 1988-2008
Microsoft Corporation Standard Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
目前發現在不同的版本上,包括小版本號碼不同,結果均有可能出現不同,不知道這些不符合聯機文檔描述的版本,是否可以稱之為Bug ?
有興趣的朋友可以測試貼一下你的sql版本的結果。