SQL Server: 変数やスカラー値関数の戻り値など、値のデータ型を確認する方法
変数やスカラー値関数の戻り値などのデータ型を確認する方法
あんまりないかもしれませんが、ビルトイン関数のスカラー関数を使った後、暗黙の型変換が行われたりして、変数や戻り値のデータ型を確認したいような時はないでしょうか?
今回はそんな時に便利な関数をご紹介します!
SQL_VARIANT_PROPERTY 関数
SQL_VARIANT_PROPERTY 関数は、第一引数の値について、第二引数で指定したプロパティを返します。
構文は次の通りです。
SQL_VARIANT_PROPERTY ( [値], [プロパティ] )
[プロパティ] には次のようなものが指定可能です。
- BaseType
- Precision
- Scale
- TotalBytes
- Collation
- MaxLength
例えば、NVARCHAR(50) や DECIMAL(19,5) で定義された値には各プロパティ次のような値が返ってきます。
DECLARE @Memo NVARCHAR(50) = 'Test'; SELECT SQL_VARIANT_PROPERTY(@Memo, 'BaseType') AS [BaseType], SQL_VARIANT_PROPERTY(@Memo, 'Precision') AS [Precision], SQL_VARIANT_PROPERTY(@Memo, 'Scale') AS [Scale], SQL_VARIANT_PROPERTY(@Memo, 'TotalBytes') AS [TotalBytes], SQL_VARIANT_PROPERTY(@Memo, 'Collation') AS [Collation], SQL_VARIANT_PROPERTY(@Memo, 'MaxLength') AS [MaxLength]; ------------ DECLARE @Amount DECIMAL(19,5) = 15.66; SELECT SQL_VARIANT_PROPERTY(@Amount, 'BaseType') AS [BaseType], SQL_VARIANT_PROPERTY(@Amount, 'Precision') AS [Precision], SQL_VARIANT_PROPERTY(@Amount, 'Scale') AS [Scale], SQL_VARIANT_PROPERTY(@Amount, 'TotalBytes') AS [TotalBytes], SQL_VARIANT_PROPERTY(@Amount, 'Collation') AS [Collation], SQL_VARIANT_PROPERTY(@Amount, 'MaxLength') AS [MaxLength];
変数だけ定義して、値を代入しないで SQL_VARIANT_PROPERTY に渡すと、第一引数が NULL になるので、全てのプロパティが NULL で返ってくるので注意してください。
上記のケースでは SQL_VARIANT_PROPERTY を使う真上でデータ型を指定して変数を宣言しているので、意味があんまりありませんね。
次は暗黙的に変換された値のデータ型を調べてみましょう。
例えば、COALESCE 関数は引数を順番に前からチェックしていって、NULL ではない最初の値を返しますが、戻り値のデータ型は引数の中で優先順位が最も高いデータ型になります。
COALESCE(NULL, 1, '2', 5.5) の戻り値のデータ型を確認してみましょう。 ここでは BaseType のみ確認します。
SELECT COALESCE(NULL, 1, '2', 5.5) AS Result, SQL_VARIANT_PROPERTY(COALESCE(NULL, 1, '2', 5.5), 'BaseType') AS BaseType;
最初の NULL でない値は 1 ですが、1.0 に変換されていて、BaseType は numeric になっていますね。
また、次のように INT 型と INT 型の割り算が INT 型になってしまうことも確認できます。
DECLARE @Value1 INT = 15, @Value2 INT = 2; SELECT @Value1 / @Value2 AS Result, SQL_VARIANT_PROPERTY(@Value1 / @Value2, 'BaseType') AS BaseType;
値のデータ型を確認したくなった時には使ってみてくださいね!