Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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中,是否可以用接受XML参数的单个插入替换多个插入?_Xml_Sql Server 2008_Insert - Fatal编程技术网

在SQL Server中,是否可以用接受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应

因此,我有一个现有的ASP.NET解决方案,它使用LINQ to SQL将数据插入SQL Server(5个表,总共110k条记录)。我以前读过,XML可以作为参数传递给SQL Server,但我的google搜索结果会将XML直接存储到表中。我宁愿使用该XML参数并将节点作为记录插入

这可能吗?它是如何完成的(即如何使用XML参数在T-SQL中插入记录,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)