WHERE
句で列_col1
_と変数_@myvar
_を比較しようとしています。通常、どちらにもGUIDが含まれますが、NULL値が含まれる場合もあります。 _NULL=NULL
_がWHERE ISNULL(col1, '')=ISNULL(@myvar, '')
を使用してFALSEに評価されるという事実を回避できると思いました。代わりに2つの空の文字列を比較し、TRUEと評価します。
ただし、これにより次のエラーメッセージが生成されます。
メッセージ8169、レベル16、状態2、行3文字列からuniqueidentifierへの変換時に変換に失敗しました。
私は試した
_DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1
_
同じエラーメッセージ。
2つの質問:最初に、エラーメッセージが示すように、一意の変数を(NULL値であっても)(空!)文字列に変換しようとしています。何ができますか?
2番目に、NULLの可能性があるuniqueidentifiersを比較できるようにするために、WHERE句が必要なWordへのより良い方法はありますか?
渡した最初の引数isnull
はliteral null
ではないため、その呼び出しの戻り値の型、uniqueidentifier
が決定されます場合。 2番目の引数''
、このタイプにキャストできないため、エラーが発生しています。
これを回避する1つの方法は、null
sを明示的にチェックすることです。
WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
以下の式は、GUID列が空かどうかを確認するために使用できると思います
CAST(0x0 AS UNIQUEIDENTIFIER)
何かのようなもの
...WHERE GuidId <> CAST(0x0 AS UNIQUEIDENTIFIER)
次のコードを試してください:
WHERE ISNULL([Guid], NEWID()) = @myvar
他の人が指摘したように、結果からNULL値を除外して、比較を行います。 COALESCEを使用して、比較からNULL値を除外できます。
ISNULL
が機能しない理由は、置換値(チェック式が実際にnullの場合に使用される値)が暗黙的にチェック式の型に変換できる必要があるためです。
WHERE
句はcol IS NULL AND @var IS NULL
を使用してその状態を確認できます。
この問題を解決する別の方法を次に示します。
DECLARE @myvar uniqueidentifier = NEWID()
SELECT * FROM TABLE
Where ISNULL(col1,@myvar) = ISNULL(Col2,@myvar)
これでエラーが解決します。文字列からuniqueidentifier
への変換時に変換に失敗しました。