4

SQL プロシージャーに問題があり、適切な解決策が見つからないようです。ストアド プロシージャには、XML データ型 (名前 = @data) の 1 つのパラメーターが含まれています。

着信メッセージの例を次に示します (実際のメッセージにはさらに多くのノードが含まれていますが、簡単にするために省略しています)。

<Suppliers xmlns="">
  <Supplier>
    <IDCONO>3</IDCONO>
    <IDSUNO>009999</IDSUNO>
    <IDSUTY>0</IDSUTY>
  </Supplier>
</Suppliers>

私の SQL データベースには、「Supplier」というテーブルがあり、XML のノードとまったく同じ列 (IDCONO、IDSUNO、IDSUTY など) が含まれています。

ノードをループして、列にデータを挿入する必要があります。以下の手順を実装しましたが、これにより、大きなファイルで多くのパフォーマンスの問題が発生しています (長い処理時間、さらにはタイムアウト):

INSERT INTO SUPPLIER
   (IDCONO
   ,IDSUNO
   ,IDSUTY)
SELECT
   T.C.value('IDCONO[1]', 'VARCHAR(50)') as IDCONO,
   T.C.value('IDSUNO[1]', 'VARCHAR(50)') as IDSUNO,
   T.C.value('IDSUTY[1]', 'VARCHAR(50)') as IDSUTY
from @data.nodes('/Suppliers/Supplier') T(C)

どんな助けでも大歓迎です!SQL のバージョンは SQL Server 2012 であることに注意してください。

前もって感謝します。

4

1 に答える 1

6

最初に試みたのはtext()、XML データ型を使用するときにノードを指定して、SQL Server がテキスト要素を詳細に検索しないようにすることです。

INSERT INTO SUPPLIER
   (IDCONO
   ,IDSUNO
   ,IDSUTY)
SELECT
   T.C.value('(IDCONO/text())[1]', 'VARCHAR(50)') as IDCONO,
   T.C.value('(IDSUNO/text())[1]', 'VARCHAR(50)') as IDSUNO,
   T.C.value('(IDSUTY/text())[1]', 'VARCHAR(50)') as IDSUTY
FROM @data.nodes('/Suppliers/Supplier') T(C)

それが十分でない場合は、代わりに OPENXML を試してみます。

DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUT, @data

INSERT INTO SUPPLIER
   (IDCONO
   ,IDSUNO
   ,IDSUTY)
SELECT IDCONO, IDSUNO, IDSUTY
FROM OPENXML(@idoc, '/Suppliers/Supplier', 2) WITH
        (IDCONO VARCHAR(50),
         IDSUNO VARCHAR(50),
         IDSUTY VARCHAR(50))


EXEC sp_xml_removedocument @idoc
于 2013-05-27T12:49:57.273 に答える