21

式を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はこの列のデータ型をどのように決定しますか?

4

2 に答える 2

27

さらに、データ型の優先順位に依存するのではなく、特定のデータ型を強制する場合は、CONVERTまたはCASTを計算で強制することができます(すべての潜在的な結果が選択した型と互換性があると仮定します)。これは、デフォルトで、意図したよりも広いデータ型になってしまう場合に非常に役立ちます。私が見た中で最も一般的なユースケースは、たとえばBITではなくINTになってしまう場合です。

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

この場合Active1INT(4バイト)でActive2あり、は(1バイト-他の列BITに隣接している場合は1バイト以下になる可能性があります)です。BIT

于 2012-09-23T17:13:46.580 に答える
16

式の場合、データ型の優先順位が最も高いCASEブランチです。あなたの例では、3つのブランチはすべて、整数として解釈される範囲内にあるリテラルであるため、列のタイプは次のようになります。int

ここでの私の答えに従って、sql_variant_propertyリテラル式がどのデータ型であるかを判別するために使用できます。たとえば、ではなくとして解釈されます。2147483648numeric(10,0)bigint

質問の場合、SQL Serverは、結果の列が次のようになることを認識しますが、多くの場合、計算された式の場合、その効果を得るにNOT NULLは式をでラップする必要があります。ISNULL

于 2012-09-23T17:09:39.280 に答える