web-dev-qa-db-ja.com

永続的な計算列のデータ型?作成時に変換/キャストする必要がありますか?

永続的な計算列のデータ型は何ですか?

(a)SQL Serverはそれを自動的に推測しますか?

(b)また、それをデータ型としてキャストする方が良いので、SQLはそれがどのデータ型かを見つけるのに時間を費やしませんか?

create table dbo.CustomerTransaction
(
   CustomerTransactionId int primary key identity(1,1),
   CustomerId int,
   Price decimal(10,2),
   Quantity int,
   TotalAmount as CustomerId * Price PERSISTED  -- should I cast as cast(CustomerId* Price as decimal(10,2) ??
)
3
user162241

スタックオーバーフローに関するこの質問からの情報がコミュニティWikiの回答に変わりました: 計算列のデータ型は何ですか?

最高のデータ型の優先順位 の値によって決定されます。

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

さらに、データ型の優先順位に依存せずに特定のデータ型を強制したい場合は、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)
_

この場合、_Active1_はINT(4バイト)ですが、_Active2_はBIT(1バイト以下、他のBIT列に隣接している場合)です。

0
Erik Darling