我有这个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>
答案 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)