1. ホーム
  2. sql

[解決済み] SQLクエリでuniqueidentifierに変換失敗のエラーが表示される【重複

2022-02-17 16:06:38

質問

<余談
この質問には、すでにここで回答があります :
クローズド 5年前 .

SQL Server のテーブルにカラムがあります。 userid タイプの uniqueidentifier で、列の値は 9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7E .

こんな風にクエリしているとき。

 WHERE userid = '9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7E'

クエリは正常に実行されています。文字列の末尾に余分な文字を追加しても、以下のように正常に動作しています。

WHERE userid = '9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7Eqweqweqwemmmmmmmmmm'

しかし、問題は、文字列の先頭に余分な文字を追加したときに、クエリがエラーを表示することです。

WHERE userid = 'A9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7E'

というエラーが表示されます。

<ブロッククオート

文字列からuniqueidentifierへの変換に失敗しました。

私の質問は、文字列の先頭に文字を追加しただけでエラーが表示される理由と、ストアドプロシージャ内でこのエラーを追跡する方法です。

どのように解決するのですか?

マイクロソフトのドキュメントによると

<ブロッククオート

uniqueidentifier型は、文字型とみなされます。 文字式から変換されるため、この文字式は 文字型に変換する際の切り捨てルールが適用されます。 すなわち、文字式を文字データ の型では、新しいデータ型に対して長すぎる値があります。 型は切り捨てられます。例題のセクションを参照してください。

36位以降に文字を追加しても問題なく動作するのはそのためです。

guidに文字を前置すると、guidの書式規則を破ることになり、その後変換に失敗します。

ストアドプロシージャでは、TRY_CONVERTを使用してguidを検証することができます。変換できない場合はNULLを返します。

IF TRY_CONVERT(UNIQUEIDENTIFIER,@userId) IS NULL
   BEGIN
      .... report error ...
   END

TRY_CONVERT は SQL Server 2012 以降で利用可能です。古いバージョンで UNIQUEIDENTIFIER に変換する前に文字列を検証する必要がある場合、次のコードを使用できます。

IF NOT @userId LIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]')+'%'
    BEGIN
          .... report error ...
    END