關於sql server case when ..else ..end結果型別的小議

iSQlServer發表於2009-10-15
這個問題源於csdn一貼子,後來發現sql server各版本對這個case when else end結果的處理不盡相同。。

CASE語法如下:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt關於sql server case when ..else ..end結果型別的小議/*
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 的型別集中返回優先順序最高的型別。
有關詳細資訊,請參閱 資料型別優先順序,如下

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt關於sql server case when ..else ..end結果型別的小議/*
 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)
*/

下面準備測試資料及開始測試:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt
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
關於sql server case when ..else ..end結果型別的小議
/*
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
關於sql server case when ..else ..end結果型別的小議
/*
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(4else DataLength(ID) end as IDDataLength
from @T
關於sql server case when ..else ..end結果型別的小議
/*
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版本的結果。

檢視原文:http://www.cnblogs.com/nzperfect/archive/2009/10/15/1583843.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章