永続的な計算列のデータ型は何ですか?
(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) ??
)
スタックオーバーフローに関するこの質問からの情報がコミュニティ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
列に隣接している場合)です。