在SQL Server中,是否可以用接受XML参数的单个插入替换多个插入?
因此,我有一个现有的ASP.NET解决方案,它使用LINQ to SQL将数据插入SQL Server(5个表,总共110k条记录)。我以前读过,XML可以作为参数传递给SQL Server,但我的google搜索结果会将XML直接存储到表中。我宁愿使用该XML参数并将节点作为记录插入 这可能吗?它是如何完成的(即如何使用XML参数在T-SQL中插入记录,XML应该如何格式化)在SQL Server中,是否可以用接受XML参数的单个插入替换多个插入?,xml,sql-server-2008,insert,Xml,Sql Server 2008,Insert,因此,我有一个现有的ASP.NET解决方案,它使用LINQ to SQL将数据插入SQL Server(5个表,总共110k条记录)。我以前读过,XML可以作为参数传递给SQL Server,但我的google搜索结果会将XML直接存储到表中。我宁愿使用该XML参数并将节点作为记录插入 这可能吗?它是如何完成的(即如何使用XML参数在T-SQL中插入记录,XML应该如何格式化) 注意:我正在研究其他选项,如SQL批量复制,我知道SSIS将是一个不错的选择。我想知道这种XML方法是否可行。XML应
注意:我正在研究其他选项,如SQL批量复制,我知道SSIS将是一个不错的选择。我想知道这种XML方法是否可行。XML应该像普通XML文档那样格式化。然后使用参数类型XML将其传递给存储过程 下面是一个如何进行插入的示例。在本例中,@p_AdditionalContactInfo是XML,其形式如下:
<entities>
<entity>
<firstName>Joey</firstName>
...
</entity>
.. more entity records
</entities>
对于SQLServer2008,真的不再需要像使用OPENXML这样的遗留方法了——这是一个非常复杂的接口,不是很有用 相反,请使用本机SQL Server XQuery将XML文档“切碎”成碎片并存储:
INSERT INTO
dbo.YourTableName(.... list of fields.......)
SELECT
nodes.entity.value('(firstName)[1]', 'varchar(50)'),
nodes.entity.value('(lastName)[1]', 'varchar(50)'),
........ (more columns as needed) ...........
FROM
@XmlInput.nodes('/entities/entity') AS nodes(entity)
是的,您可以利用SQL Server的内置XML支持。实际上,您不需要使用sp_xml_preparedocument等
关于将一组记录传递到存储过程并持久化到db(CSV vs XML vs TABLE valued参数)的各种方法,请看一下,因为我已经给出了这些方法的示例,并对它们进行了性能比较。简而言之,我建议检查表值参数——这是一种更自然的方法,并提供了最好的性能。总的来说,我发现XML到数据库的转换充其量也不方便。它们通常是必需的,但如果您能够利用传统技术(如分隔文件),您应该会发现实现和支持起来要容易得多。我发现,从性能角度来看,OPENXML可以比使用.nodes和许多.value方法调用快得多。我发现这是可行的,但与使用openxml处理大型数据集相比,性能很差。也就是说,XQuery更具可读性,在性能不是问题的情况下可能更合适。谢谢你的意见。非常感谢你的建议。一旦我克服了一些转换障碍,我就能够将一个15分钟的上传解决方案(包含110k个插入)降低到一个3分钟的上传解决方案(包含20-30个插入)(由于内存不足,当XML达到一定大小时,我不得不发送它)。@Mayo-不客气,我很高兴听到这个答案帮助你解决了问题:)
INSERT INTO
dbo.YourTableName(.... list of fields.......)
SELECT
nodes.entity.value('(firstName)[1]', 'varchar(50)'),
nodes.entity.value('(lastName)[1]', 'varchar(50)'),
........ (more columns as needed) ...........
FROM
@XmlInput.nodes('/entities/entity') AS nodes(entity)