在SQL Server中,可以使用带有XML参数的单个插入替换多个插入吗?

时间:2010-04-28 13:28:39

标签: xml sql-server-2008 insert

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

这可能吗?它是如何完成的(即如何使用XML参数在T-SQL中插入记录,如何格式化XML?)

注意:我正在研究SQL批量复制等其他选项,我知道SSIS是一个不错的选择。我想知道这种XML方法是否可行。

3 个答案:

答案 0 :(得分:3)

XML应该格式化为普通的XML文档。然后,您只需使用参数类型XML将其传递给存储过程。

以下是如何进行插入的示例。在这种情况下,@ p_AdditionalContactInfo是XML,它采用以下形式:

<entities>
  <entity>
    <firstName>Joey</firstName>
    ...        
  </entity>
  .. more entity records
</entities>

这是t-sql示例:

  DECLARE @l_index int

  -- parse the records from the XML
  EXECUTE sp_xml_preparedocument @l_index OUTPUT, @p_AdditionalContactInfo
  INSERT INTO @l_AdditionalContactInfoTbl
            ( ContactInfoID
            , FirstName
            , LastName 
            , ContactTypeID
            , Title
            , Email
            , AddressLine1
            , AddressLine2
            , City
            , State
            , Zip
            , MobilePhone
            , BusinessPhone
            , UpdateDateTime )
       SELECT ContactInfoID
            , FirstName
            , LastName
            , ContactTypeID
            , Title
            , Email
            , AddressLine1
            , AddressLine2
            , City
            , State
            , Zip
            , MobilePhone
            , BusinessPhone
            , UpdateDateTime
         FROM OPENXML (@l_index, 'entities/entity', 1)
              WITH (  ContactInfoID  int          'id'
                    , FirstName      varchar(50)  'firstName'
                    , LastName       varchar(50)  'lastName'
                    , ContactTypeID  int          'contactTypeId'
                    , Title          varchar(20)  'title'
                    , Email          varchar(100) 'email'
                    , AddressLine1   varchar(100) 'addressLine1'
                    , AddressLine2   varchar(100) 'addressLine2'
                    , City           varchar(50)  'city'
                    , State          varchar(2)   'state'
                    , Zip            varchar(5)   'zip'
                    , MobilePhone    varchar(12)  'mobilePhone'
                    , BusinessPhone  varchar(12)  'businessPhone'
                    , UpdateDateTime datetime     'updateDateTime'
                   )
  EXECUTE sp_xml_removedocument @l_index

答案 1 :(得分:2)

对于SQL Server 2008,对于使用FOR 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)

答案 2 :(得分:2)

是的,您可以使用SQL Server的内置XML支持。实际上你不需要使用sp_xml_preparedocument等。

I wrote up an article关于将一组记录传递给sproc的各种方法,可以持久保存到db(CSV vs XML vs TABLE values参数) - 看看那个就像我一样给出了这些方法的例子,并对它们进行了性能比较。简而言之,我建议查看表值参数 - 这是一种更自然的方式,并提供最佳性能。