簡體   English   中英

sql server存儲過程中的xml參數

[英]xml parameter in sql server stored procedure

我想編寫一個存儲過程,接受一個XML參數,解析它的元素,然后將它們插入表SQL中。 這是我的XML:

<Lines>
   <Line>
      <roomlist>
         <room>
            <namehotel>MeSa</namehotel>
            <typeroom>506671</typeroom>
            <typeroomname>Dbl Standard - Tip</typeroomname>
            <roomnumber>0</roomnumber>
            <priceroom>444.60</priceroom>
            <costroom>400.00</costroom>
            <boardtype/>
            <paxes>
               <pax>
                  <name>EU</name>
                  <lastname>CADO</lastname>
                  <typepax>Adult</typepax>
               </pax>
               <pax>
                  <name>LIN</name>
                  <lastname>BAC</lastname>
                  <typepax>Adult</typepax>
               </pax>
            </paxes>
         </room>
      </roomlist>
   </Line>
</Lines>

那怎么辦

嘗試這個

CREATE PROCEDURE P_NAME(V_XML_STRING VARCHAR(MAX))
AS
BEGIN
    DECLARE @XML AS XML;
    SELECT @XML = CAST(V_XML_STRING as XML)

    ;with numDim as
    (
      select number
      from master..spt_values
      where type = 'P'
    )
    -- INSERT INTO TABLENAME (COLS LIST HERE ...) 
    select 
    y.value('namehotel[1]', 'varchar(50)') as namehotel,
    y.value('typeroom[1]', 'varchar(50)') as typeroom, 
    y.value('typeroomname[1]', 'varchar(50)') as typeroomname, 
    y.value('roomnumber[1]', 'numeric(10)') as roomnumber, 
    y.value('priceroom[1]', 'numeric(10,2)') as priceroom, 
    y.value('costroom[1]', 'numeric(10,2)') as costroom, 
    y.value('boardtype[1]', 'varchar(50)') as boardtype,
    y.value('(paxes/pax[position()=sql:column("N.Number")]/name)[1]', 
            'varchar(50)') as Pax_name,
    y.value('(paxes/pax[position()=sql:column("N.Number")]/lastname)[1]', 
            'varchar(50)') as Pax_lastname,
    y.value('(paxes/pax[position()=sql:column("N.Number")]/typepax)[1]', 
            'varchar(50)') as Pax_typepax
    from @xml.nodes('/Lines/Line/roomlist/room')  as x(y)
    cross join numDim as N
    where N.number between 1 and (X.Y.value('count(paxes/pax/name)', 'int'))
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM