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

jra*_*ara 18 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
Run Code Online (Sandbox Code Playgroud)

SQL Server如何决定此列的数据类型?

Aar*_*and 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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下Active1INT(4字节)while Active2BIT(1字节 - 或更少,如果它与其他BIT列相邻,则可能).

  • 如果你想维护一个非null的契约,你必须将这整件事包装在`ISNULL([CONVERT(..)],0)中,尽管1或0永远不为空. (2认同)

Mar*_*ith 15

对于CASE表达式,它是具有最高数据类型优先级的分支.在您的示例中,所有三个分支都是在将被解释为整数的范围内的文字,因此列的类型将是int

您可以根据我的答案sql_variant_property确定文字表达式的数据类型.例如被解释为而不是.2147483648numeric(10,0)bigint

在问题的情况下,SQL Server认识到结果列将是NOT NULL但通常用于计算表达式,因此有必要将表达式包装在一个中ISNULL以获得该效果.