В SQL Server можно ли заменить несколько вставок одной вставкой, которая принимает параметр XML? - PullRequest
3 голосов
/ 28 апреля 2010

Итак, у меня есть существующее решение ASP.NET, которое использует LINQ-to-SQL для вставки данных в SQL Server (5 таблиц, всего 110 тыс. Записей). В прошлом я читал, что XML можно передавать в качестве параметра в SQL Server, но мои поиски в Google приводят к результатам, которые хранят XML непосредственно в таблице. Я бы предпочел этот параметр XML и вставить узлы в виде записей.

Возможно ли это? Как это делается (то есть, как параметр XML используется для вставки записей в T-SQL, как должен форматироваться XML)?

Примечание. Я изучаю другие варианты, такие как массовое копирование SQL, и знаю, что SSIS будет хорошей альтернативой. Я хочу знать, возможен ли этот подход XML.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2010

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
2 голосов
/ 28 апреля 2010

Да, вы можете использовать встроенную в SQL Server поддержку XML. На самом деле вам не нужно использовать sp_xml_preparedocument и т. Д.

Я написал статью о различных подходах, которые можно использовать для передачи набора записей в sproc, чтобы сохранить его в БД (CSV против XML и с табличным параметром TABLE) - иметь посмотрите на это, поскольку я привел примеры подходов и провел сравнение их эффективности. Короче говоря, я бы порекомендовал проверить параметры с табличными значениями - это гораздо более естественный способ сделать это и обеспечить наилучшую производительность.

2 голосов
/ 28 апреля 2010

В 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...