2

XMLを介して一意の識別子のリストを受け取るストアドプロシージャがあります。1つ以上の文字列が有効なuniqueidentifierではない可能性があります。SQLServerはこの変換時に例外をスローし、プロシージャ全体が中止されます。

これらのエラーを抑制して続行することは可能ですか?1つを除くすべてのIDが有効な場合、1つのIDの解析に失敗したことを示すエラーメッセージではなく、有効なIDのすべてのデータが必要です。

関連する選択:

SELECT *
FROM dbo.Daily dd           
    INNER JOIN dbo.Member m ON m.MemberId = dd.MemberID
    INNER JOIN OPENXML(@hdoc, 'list_of_guids/id/text()', 1) with (guid uniqueidentifier '.') x
            ON x.guid = m.MemberGuid

サンプルXML、最後のエントリが無効であることに注意してください。

<list_of_guids>
<guid>7B8CFAED-8C59-431D-9447-2A45BD4612E5</guid>
<guid>537F4129-0732-4D29-B3B8-4B9127F8522F</guid>
<guid>9965395A-676F-48F2-91CC-F46527D134C</guid>
</list_of_guids>

1つの可能性は、uniqueidentifiersをその逆ではなくvarcharに変換することですが、uniqueidentifierはメンバーテーブルのインデックスであるため、パフォーマンスに影響を与えます。

4

1 に答える 1

1

開いているxmlを読み取っても、内部にあるデータ型に関係なく、パフォーマンスは変わりません。このようなことを検討しましたか(主に疑似):

SELECT * FROM OPENXML ... INTO #tmp; -- using VARCHAR type, not GUID

DELETE #tmp WHERE col NOT LIKE '[0-9A-F]...' -- delete those not matching pattern
  OR col IS NULL;

ALTER TABLE #tmp ALTER COLUMN col UNIQUEIDENTIFER;
-- create index here too maybe

SELECT FROM #tmp JOIN other tables;

私が提案したように、これはSQL Server 2012の方が簡単です。そして、これらの行を#tempテーブルに書き込むことで、GUID列のインデックスが大きな助けになる場合、全体的なパフォーマンスがそれほど変わるとは思いません。

于 2012-05-02T19:17:56.463 に答える