web-dev-qa-db-ja.com

SQL Server:uniqueidentifierのISNULL

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へのより良い方法はありますか?

12
TVogt

渡した最初の引数isnullliteral nullではないため、その呼び出しの戻り値の型、uniqueidentifierが決定されます場合。 2番目の引数''、このタイプにキャストできないため、エラーが発生しています。

これを回避する1つの方法は、nullsを明示的にチェックすることです。

WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
10
Mureinik

以下の式は、GUID列が空かどうかを確認するために使用できると思います

CAST(0x0 AS UNIQUEIDENTIFIER)

何かのようなもの

...WHERE GuidId <>  CAST(0x0 AS UNIQUEIDENTIFIER)
9
NidhinSPradeep

次のコードを試してください:

WHERE ISNULL([Guid], NEWID()) = @myvar 
2
Sanjeev Gaur

他の人が指摘したように、結果からNULL値を除外して、比較を行います。 COALESCEを使用して、比較からNULL値を除外できます。

2
Emacs User

ISNULLが機能しない理由は、置換値(チェック式が実際にnullの場合に使用される値)が暗黙的にチェック式の型に変換できる必要があるためです。

WHERE句はcol IS NULL AND @var IS NULLを使用してその状態を確認できます。

2
Amit

この問題を解決する別の方法を次に示します。

DECLARE @myvar uniqueidentifier = NEWID()

SELECT * FROM TABLE
Where ISNULL(col1,@myvar) = ISNULL(Col2,@myvar)

これでエラーが解決します。文字列からuniqueidentifierへの変換時に変換に失敗しました。

0
dasarghya