すでにいくつかの良い答えがあることは知っていますが、SQL_VARIANT_PROPERTYは誤解されていると思います。
SQL_Variant_Propertyを列とともに使用し、次にそのメタデータプロパティに必要なものを示します。ただし、nullの場合は、あまりわかりません。
例えば:
declare
@Start date = getdate()
, @End datetime= getdate()
, @Int int = 1
, @DateNull date
;
select
sql_variant_property(@Start, 'BaseType')
, sql_variant_property(@End, 'BaseType')
, sql_variant_property(@Int, 'BaseType')
, sql_variant_property(@DateNull, 'BaseType')
3つのデータ型とnullを返します。NULLの処理はSQLの重要な部分です。私を含め、非常に多くの人々が、nullを表す値でnullを処理したい場合もあれば、気にしない場合もあります。SQLバリアントは、引数'BaseType'が設定された値に対してのみ機能します。それ以外の場合は、nullを返します。私の知る限り、これはSQLが次のように言っているためです。「ここにはデータがなく、メモリ使用量を決定するものは何もありません。」
一般に、整数を操作する場合はisnull(@thing、0)を指定しますが、データセットに未知数のゼロを明示的に含める必要があります。また、nullが発生したことで、レポートに対して他のisnull(@thing、'not present')が発生したことをユーザーに知らせたい場合もあります。さらに別の場合は、基本的に一連の可能性の合体に合体を使用できます(@thing、@ otherthing、@ yetotherthing、'不明')。
私はあなたが本当にそのようなことをする必要がある場所がわからないときに誰かが何かを変換しているのを目撃しているコードであると思います。テーブル内の列のデータ型は、必要なものが維持され、NULLの場合、SQLはその列にメモリを格納しません。したがって、それを変更する必要性は恣意的な私見のようです。SQL 2008で導入されたSPARSEオプションを使用すると、より多くのnullを期待できる場合に、より良いメモリ消費を処理できることを私は知っています。