ISNUMERIC<のバージョンが必要なようです。 /a> XML データの関数。
残念ながら、そのような組み込み関数は存在しません。そのため、いくつかのオプションがある独自の代替手段を考案する必要があります:
これがパフォーマンスが重要ではない 1 回限りのまたは小規模なプロセスである場合は、TRY...CATCH
を使用して、カーソル内で一度に 1 行ずつ入力テーブルを処理できます。 無効なキャストを処理するブロック (未テスト):
DECLARE xmlCur CURSOR FOR
SELECT textcol
FROM inputTable
OPEN xmlCur
DECLARE @string nvarchar(MAX)
DECLARE @xml xml
FETCH NEXT FROM xmlCur into @string
WHILE @@fetch_status = 0
BEGIN
BEGIN TRY
SET @xml = CAST(@string AS XML)
-- Do something with XML
END TRY
BEGIN CATCH
-- log failure/mark source row as invalid
END CATCH
FETCH NEXT FROM xmlCur into @string
END
CLOSE xmlCur
DEALLOCATE xmlCur
または、.Net プログラミングに慣れている (そしてサーバーで有効になっている) 場合は、CLR 独自の IsXML 関数を作成します。 .Net コードは、このスレッド の 3 番目の投稿よりもそれほど複雑にする必要はありません。> .
CLR ソリューションのパフォーマンスは、カーソルよりも優れているとは限りません。これを確認するにはテストが必要です。
(うまくいかない明らかなことは、TRY...CATCH
内でフィールドを XML にキャストしようとするスカラー値の T-SQL 関数です。 ブロック。ただし、 TRY...CATCH
関数内では許可されていません。)