9

int に変換できない varchar エントリを持つ MSSQL のテーブル内の行を検出する方法が必要です。

私が取り組んでいるシステムは、ある場所で編集可能な varchar フィールドを使用し、それを別の場所の整数列に結合します。varchar フィールドに無効な数値 (空白、アルファまたは記号を含むもの、または 21 億 (最大 int サイズ) を超える数値) が含まれている場合、他のクエリは失敗し、値 xyz が int 列をオーバーフローしたか、変換されません。

問題のあるレコードを見つけるために、次の部分的な解決策を思いつきました。

select g.id, g.membernumber from groups g
left join secondary_groups sg on sg.id=g.id 
where convert(bigint, g.membernumber) > 2147483647 
or isnumeric(g.membernumber) = 0

これはほとんどの場合にうまく機能しますが、varchar 値が「bigint」を超えると失敗する可能性があることに気付きました。キャスト/変換を使用する代わりに、これらのタイプのレコードを見つけるためのより一般的な方法はありますか? 「IsInt()」の組み込みメソッドがあれば最高ですが、残念ながら...

4

2 に答える 2

7

INT のみに関心がある場合は、PATINDEX('[^0-9]', g.membernumber) を使用して、文字列に数値以外の文字が含まれているかどうかをテストできます。次に、LEN を使用して文字列が 10 文字を超えていないことを確認してから、bigint への変換を試みます。したがって、WHERE 条件は次のようになります。

where 1 = CASE WHEN patindex('%[^0-9]%', g.membernumber) > 0 THEN 1
               WHEN LEN(g.membernumber) > 10 THEN 1
               WHEN convert(bigint, g.membernumber) > 2147483647 THEN 1
               WHEN LEN(g.membernumber) = 0 THEN 1 --Empty string causes error on convert
               ELSE 0 END

SQL Server CASEは短絡評価として機能します。そのため、where 句で CASE を使用しました。

SQLフィドル

于 2013-06-17T23:21:23.197 に答える