当CREATE TABLE
使用CASE
表达式创建计算列时,您没有显式定义此列的数据类型:
CREATE TABLE OrderDetail
( OrderID INT
, ProductID INT
, Qty INT
, OrderDate DATETIME
, ShipDate DATETIME
, STATUS AS CASE
WHEN shipdate is NULL AND orderdate < DATEADD( dd, -7, GETDATE()) THEN 3
WHEN shipdate is NOT NULL THEN 2
ELSE 1
end
)
GO
SQL Server如何决定此列的数据类型?
答案 0 :(得分:23)
此外,如果要强制使用特定数据类型而不是依赖数据类型优先级,可以在计算中使用CONVERT
或CAST
来强制它(假设所有可能的结果都是兼容的)与您选择的类型)。如果默认情况下您的数据类型比预期的更宽,则这非常有用;我见过的最常见的用例是当你最终得到INT而不是比如BIT:
Active1 AS CASE WHEN something THEN 1 ELSE 0 END,
Active2 AS CONVERT(BIT, CASE WHEN something THEN 1 ELSE 0 END)
在这种情况下,Active1
是INT
(4个字节),而Active2
是BIT
(1个字节 - 或更少,如果它与其他相邻,则可能BIT
列。)
答案 1 :(得分:15)
对于CASE
表达式,它是highest datatype precedence的分支。在您的示例中,所有三个分支都是在将被解释为整数的范围内的文字,因此列的类型将为int
您可以使用sql_variant_property
来确定文字表达式as per my answer here的数据类型。例如2147483648
被解释为numeric(10,0)
而不是bigint
。
在问题的情况下,SQL Server认识到结果列将是NOT NULL
,但通常对于计算表达式,有必要将表达式包装在ISNULL
中以获得该效果。