删除SQL Server 2008中的XML子节点元素

时间:2016-06-11 07:35:35

标签: sql-server xml sql-server-2008

我有这个xml,我想将它插入临时表中,包括单行中<salesorpurchase>节点内的值。这可能吗?

或者,您能告诉我如何删除<SalesOrPurchase>而不删除其内部文本吗?

<ItemServiceRet> 
    <ListID>80000012-1302270176</ListID> 
    <EditSequence>1302270195</EditSequence>
    <Name>2nd Floor Shop</Name>
    <FullName>2nd Floor Shop</FullName> 
    <IsActive>true</IsActive>
    <SalesOrPurchase>
        <Price>0.00</Price>
        <AccountRef> 
            <ListID>800000B3-1302260225</ListID>
            <FullName>Rent Income:Rent income 2ND FL:2nd Floor Shops</FullName> 
        </AccountRef>
    </SalesOrPurchase>
</ItemServiceRet> 
<ItemServiceRet> 
    <ListID>80000002-1277187768</ListID> 
    <EditSequence>1463398389</EditSequence>
    <Name>VAT 16%</Name> 
    <FullName>VAT 16%</FullName>
    <IsActive>true</IsActive> 
    <SalesOrPurchase>
        <PricePercent>16.00</PricePercent> 
        <AccountRef>
            <ListID>6B0000-1224749077</ListID> 
            <FullName>Vat account</FullName> 
        </AccountRef> 
    </SalesOrPurchase> 
</ItemServiceRet> 

1 个答案:

答案 0 :(得分:1)

1)尝试以下查询将每个ItemServiceRet元素的数据插入一行(在这种情况下,因为有两个ItemServiceRet元素将插入两行:

DECLARE @XmlData XML = N'
<ItemServiceRet> 
    <ListID>80000012-1302270176</ListID> 
    <EditSequence>1302270195</EditSequence>
    <Name>2nd Floor Shop</Name>
    <FullName>2nd Floor Shop</FullName> 
    <IsActive>true</IsActive>
    <SalesOrPurchase>
        <Price>0.00</Price>
...
</ItemServiceRet>'

SELECT  ListID          = y.XmlCol.value('(ListID)[1]', 'VARCHAR(19)'),
        EditSequence    = y.XmlCol.value('(EditSequence)[1]', 'INT'),
        -- ...
        Price           = y.XmlCol.value('(SalesOrPurchase/Price)[1]', 'NUMERIC(9,2)'),
        PricePercent    = y.XmlCol.value('(SalesOrPurchase/PricePercent)[1]', 'NUMERIC(9,2)'),
        ListID2         = y.XmlCol.value('(SalesOrPurchase/AccountRef/ListID)[1]', 'VARCHAR(19)')
INTO    #Items
FROM    (VALUES (@XmlData)) x(XmlCol)/*or @XmlData.nodes*/
CROSS APPLY x.XmlCol.nodes(N'ItemServiceRet') y(XmlCol)

/*
Results:
(2 row(s) affected)
*/

此解决方案使用两种XML方法:nodes(将XML分为多行)和值(它从当前节点/元素中提取一个值)。

2)第二个解决方案是&#34;删除&#34; SalesOrderHeader节点因此:

SELECT  x.XmlCol.query('
    for $i in (ItemServiceRet)
        return
            <ItemServiceRet>
                <ListID>{$i/ListID/text()}</ListID> 
                <IsActive>{$i/IsActive/text()}</IsActive>
                <Price>{$i/SalesOrPurchase/Price/text()}</Price>
                <PricePercent>{$i/SalesOrPurchase/PricePercent/text()}</PricePercent>
                <AccountRef>
                    <ListID>{$i/SalesOrPurchase/AccountRef/ListID/text()}</ListID>  
                    <FullName>{$i/SalesOrPurchase/AccountRef/FullName/text()}</FullName> 
                </AccountRef>
            </ItemServiceRet>
') AS NewXmlCol
FROM    (SELECT (@XmlData)) x(XmlCol)