计算列的数据类型是什么?

时间:2012-09-23 17:03:47

标签: sql sql-server calculated-columns

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如何决定此列的数据类型?

2 个答案:

答案 0 :(得分:23)

此外,如果要强制使用特定数据类型而不是依赖数据类型优先级,可以在计算中使用CONVERTCAST来强制它(假设所有可能的结果都是兼容的)与您选择的类型)。如果默认情况下您的数据类型比预期的更宽,则这非常有用;我见过的最常见的用例是当你最终得到INT而不是比如BIT:

Active1 AS CASE WHEN something THEN 1 ELSE 0 END,
Active2 AS CONVERT(BIT, CASE WHEN something THEN 1 ELSE 0 END)

在这种情况下,Active1INT(4个字节),而Active2BIT(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中以获得该效果。