Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL process XML性能:插入表中的列_Sql Server_Xml_Stored Procedures_Sql Server 2012 - Fatal编程技术网

Sql server SQL process XML性能:插入表中的列

Sql server SQL process XML性能:插入表中的列,sql-server,xml,stored-procedures,sql-server-2012,Sql Server,Xml,Stored Procedures,Sql Server 2012,我在SQL过程中遇到问题,似乎找不到合适的解决方案。 存储过程包含一个XML数据类型的参数(name=@data) 传入消息的一个示例如下(实际消息包含更多的节点,但为了简单起见,我省略了它们): 感谢您的帮助! 请注意,SQL版本是SQL server 2012 提前感谢。我要尝试的第一个方法是在使用XML数据类型时指定text()节点,以防止SQL Server对文本元素进行深度搜索 INSERT INTO SUPPLIER (IDCONO ,IDSUNO ,IDSUTY)

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

传入消息的一个示例如下(实际消息包含更多的节点,但为了简单起见,我省略了它们):

感谢您的帮助! 请注意,SQL版本是SQL server 2012


提前感谢。

我要尝试的第一个方法是在使用XML数据类型时指定
text()
节点,以防止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

您好,非常感谢您的回复。添加/text()只会稍微提高性能。使用OPENXML解决方案可以提供所需的性能。我做了一些研究,OPENXML函数是否真的分配了服务器1/8的内存?如果我在一个小的时间范围内多次调用存储过程(使用大的xml文件),是否会有问题?@Rise\u我无法判断您是否会有问题。我可以告诉你,我使用并且已经使用了很多
openxml
将数据加载到数据库中。最大的一批将是大约25GB的XML文件,其中每个文件的大小在1到15MB之间。我没有看到任何问题,因为我们加载了很多文件,也没有看到任何问题,因为文件很大。但这是真的。另外,SQL Server为XML处理分配了1/8的内存。
openxml
速度快得惊人。对于3000条记录(4列),我将执行时间从100.000毫秒减少到300毫秒@Yann39听起来不对。如果您使用的是SQL Server 2008/2008 R2,则可能遇到CU1中修复的错误,但需要启用跟踪标志才能启用修复。请看一看,我现在使用的是SQL Server 2008 v10.00.2573。非常感谢你的信息!
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)
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