トップ回答者
データ型(sql_variant)列のあいまい検索ができない

質問
-
こんにちわ。
実行しているSQLトレースのトレースIDが知りたくて、以下のSQL文を発行しましたが、エラーとなりました。
検索条件列のデータ型が”sql_variant”の場合、LIKEはサポートされないようです。
”sql_variant”列に対するあいまい検索を行うには、どうしたらいいのでしょうか?
環境:Windows2003、SQL Server 2008(SP1)
<エラーとなったSQL文>
DECLARE @TraceID int
SELECT @TraceID = TraceID FROM ::fn_trace_getinfo(default) WHERE value LIKE '%SQLTRACE%'
<上記の実行結果>
メッセージ 8116、レベル 16、状態 1、行 3
引数のデータ型 sql_variant は like 関数の引数 1 では無効です。
MSDNで検索したところ、「sql_variant 型のデータの使用」のページで、「sql_variant 型の列は、LIKE 述語ではサポートされません。」との記述を見つけました。
http://msdn.microsoft.com/ja-jp/library/ms181071.aspx
<正常終了したSQL文>
DECLARE @TraceID int
SELECT @TraceID = TraceID FROM ::fn_trace_getinfo(default) WHERE value = N'C:\temp\SQLTRACE\Output\CLSQLJP1_ACCESSLOG.trc'
回答
-
こんにちは、nagino です。variant 型は binary を含む様々なデータを格納できるので、文字列のみを対象として処理する LIKE は使用できません。どんなデータか分からない variant 型のデータと 文字列型のデータ SQLTRACE を比較することは、不可能です。variant 型の中のデータが文字列のみだと分かっているのであれば、CAST や CONVERT を使って文字列型に変換してから LIKE するという方法が可能です。fn_trace_getinfo.value は、確か binary は含まれなかったと思ったので、CONVERT で nvarchar(8000) などに変換してしまえば、LIKE が使えるかと思います。
MCITP(Database Developer/Database Administrator)- 回答としてマーク 高橋 春樹 2010年1月5日 8:49
すべての返信
-
こんにちは、nagino です。variant 型は binary を含む様々なデータを格納できるので、文字列のみを対象として処理する LIKE は使用できません。どんなデータか分からない variant 型のデータと 文字列型のデータ SQLTRACE を比較することは、不可能です。variant 型の中のデータが文字列のみだと分かっているのであれば、CAST や CONVERT を使って文字列型に変換してから LIKE するという方法が可能です。fn_trace_getinfo.value は、確か binary は含まれなかったと思ったので、CONVERT で nvarchar(8000) などに変換してしまえば、LIKE が使えるかと思います。
MCITP(Database Developer/Database Administrator)- 回答としてマーク 高橋 春樹 2010年1月5日 8:49