XML输入到临时表

时间:2014-10-10 11:03:44

标签: sql xml sql-server-2008

我是在SQL服务器中使用XML的新手,我正在努力获得我需要的东西。我尝试过从网站周围的一些例子到我需要但没有运气,任何帮助将不胜感激我的原始XML如下

   <?xml version="1.0" encoding="utf-8"?>
    <Service xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <mParentServiceServiceID>37694</mServiceID>
      <mJourneyMessage>Cancelled</mJourneyMessage>
      <mApplicableDate>2014-10-10</mApplicableDate>
      <Edits>
        <mServiceID>14466</mServiceID>
        <mStopSequenceOrdinal>2</mStopSequenceOrdinal>
      </Edits>
      <Edits>
        <mServiceID>14466</mServiceID>
        <mStopSequenceOrdinal>3</mStopSequenceOrdinal>
      </Edits>
      <Edits>
        <mServiceID>14467</mServiceID>
        <mStopSequenceOrdinal>5</mStopSequenceOrdinal>
      </Edits>
      <Edits>
        <mServiceID>14467</mServiceID>
        <mStopSequenceOrdinal>4</mStopSequenceOrdinal>
      </Edits>
      <Edits>
        <mServiceID>14468</mServiceID>
        <mStopSequenceOrdinal>4</mStopSequenceOrdinal>
      </Edits>
    </mEdits>
  </Service>

通过名为@Details

的XML变量将其传递到存储过程

我希望我的表格如下所示

mParentServiceID|mJourneyMessage|mApplicableDate|mServiceID|mStopsSequenceOrdinal
37694             Cancelled       2014-10-10      14466        2
37694             Cancelled       2014-10-10      14466        3
37694             Cancelled       2014-10-10      14467        5
37694             Cancelled       2014-10-10      14467        4
37694             Cancelled       2014-10-10      14468        4

我知道这不是规范化的,但这是一个临时表,以便我可以在存储到主表之前进行一些数据操作

到目前为止,我有以下

INSERT  INTO @ApplicableServices
SELECT  *
FROM    OPENXML (@Details, '/Service/', 2)
WITH    (mParentServiceServiceID int '../@SmParentServiceServiceID',
        mJourneyMessage varchar(30) '../@mJourneyMessage ',
        mApplicableDate Date '../@mApplicableDate',
        mServiceID int '@mServiceID ',
        mStopSequenceOrdinal int '@mStopSequenceOrdinal')

非常感谢

1 个答案:

答案 0 :(得分:0)

试试这个(顺便说一下,xml中有一些语法错误,所以我不得不做一些修改,所以我在下面全部列出了它):

DECLARE @XML XML =
'<?xml version="1.0" encoding="utf-8"?>
  <Service xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <mParentServiceServiceID>37694</mParentServiceServiceID>
    <mJourneyMessage>Cancelled</mJourneyMessage>
    <mApplicableDate>2014-10-10</mApplicableDate>
    <Edits>
      <mServiceID>14466</mServiceID>
      <mStopSequenceOrdinal>2</mStopSequenceOrdinal>
    </Edits>
    <Edits>
      <mServiceID>14466</mServiceID>
      <mStopSequenceOrdinal>3</mStopSequenceOrdinal>
    </Edits>
    <Edits>
      <mServiceID>14467</mServiceID>
      <mStopSequenceOrdinal>5</mStopSequenceOrdinal>
    </Edits>
    <Edits>
      <mServiceID>14467</mServiceID>
      <mStopSequenceOrdinal>4</mStopSequenceOrdinal>
    </Edits>
    <Edits>
      <mServiceID>14468</mServiceID>
      <mStopSequenceOrdinal>4</mStopSequenceOrdinal>
    </Edits>
  </Service>'

SELECT
     Serv.Edit.value('../mParentServiceServiceID[1]','INT') mParentServiceServiceID
    ,Serv.Edit.value('../mJourneyMessage[1]','VARCHAR(50)') mJourneyMessage
    ,Serv.Edit.value('../mApplicableDate[1]','DATE')        mApplicableDate
    ,Serv.Edit.value('mServiceID[1]','INT')                 mServiceID
    ,Serv.Edit.value('mStopSequenceOrdinal[1]','INT')       mStopSequenceOrdinal

FROM
            @XML.nodes ('//Edits')  AS Serv(Edit)