SQL进程XML性能:插入表中的列

Ris*_*nst 4 xml sql-server stored-procedures sql-server-2012

我在SQL过程中遇到问题,我似乎找不到合适的解决方案.存储过程包含XML数据类型的一个参数(name = @data).

传入消息的一个示例如下(实际消息包含更多节点,但为简单起见,我将其留下):

<Suppliers xmlns="">
  <Supplier>
    <IDCONO>3</IDCONO>
    <IDSUNO>009999</IDSUNO>
    <IDSUTY>0</IDSUTY>
  </Supplier>
</Suppliers>
Run Code Online (Sandbox Code Playgroud)

在我的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)
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!请注意,SQL版本是SQL Server 2012.

提前致谢.

Mik*_*son 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)
Run Code Online (Sandbox Code Playgroud)

如果这还不够好,我会尝试使用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
Run Code Online (Sandbox Code Playgroud)