[英]Update Temp table to Insert node in XML data using SQL
我的問題與此問題有關。 但是,我正在編寫一個需要幫助的干凈方案。 我是SQL的初學者,請原諒我在任何地方都不正確的地方。
我有一個過程(請在此處復制一個小示例),該過程吐出一堆XML。 在第二步中,基於參數條件,我必須為每個CID在XML中插入一個節點,然后進行最終選擇。 我在下面添加了一個Rextester鏈接:
更新的鏈接: http : //rextester.com/EFGQB11125
電流輸出:
<Main>
<ID>1001</ID>
<details>
<name>John</name>
<age>12</age>
</details>
</Main>
<Main>
<ID>1002</ID>
<details>
<name>Rick</name>
<age>19</age>
</details>
</Main>
<Main>
<ID>1003</ID>
<details>
<name>Diane</name>
<age>25</age>
</details>
</Main>
<Main>
<ID>1004</ID>
<details>
<name>Kippy</name>
<age>26</age>
</details>
</Main>
所需的輸出:
當@type ='N'/'U'時
<Main>
<ID>1001</ID>
<type>N</type>
<details>
<name>John</name>
<age>12</age>
</details>
</Main>
<Main>
<ID>1002</ID>
<type>U</type>
<details>
<name>Rick</name>
<age>19</age>
</details>
</Main>
<Main>
<ID>1003</ID>
<type>N</type>
<details>
<name>Diane</name>
<age>25</age>
</details>
</Main>
<Main>
<ID>1004</ID>
<type>N</type>
<details>
<name>Kippy</name>
<age>26</age>
</details>
</Main>
因此,對於每個CID,基於@type值,應使用該值插入節點。 有幫助嗎?
(很抱歉有多余的機會)
以下示例中使用的技巧使用了一些Dynamic Sql魔術。
基本上用每個ID的所有更新構建1個大SQL。
declare @Sql varchar(max);
select @Sql = concat(@Sql,'UPDATE #final SET xml_data.modify(''insert <type>',ctype,'</type> after (/Main/ID)[text()="',cid,'"][1]'');',CHAR(13),CHAR(10))
from #tbl;
-- select @Sql as xml_modify_sqls;
exec(@Sql);
select * from #final;
這是一些使用示例數據設置臨時表的SQL:
IF OBJECT_ID('tempdb..#tbl') IS NOT NULL DROP TABLE #tbl;
create table #tbl (cid int, ctype varchar(5));
IF OBJECT_ID('tempdb..#cdetails') IS NOT NULL DROP TABLE #cdetails;
create table #cdetails (cid int, name varchar(5), age int);
IF OBJECT_ID('tempdb..#final') IS NOT NULL DROP TABLE #final;
create table #final (xml_data xml);
insert into #tbl (cid, ctype) values
(1001,'N'), (1002,'U'), (1003,'N'), (1004,'N');
insert into #cdetails (cid, name, age) values
(1001,'John',12), (1002,'Rick',19), (1003,'Diane',25), (1004,'Kippy',26);
insert into #final (xml_data)
select xml_data
from (
select
cd1.cid as ID,
-- type = t.ctype as type,
details =
(
select
cd.name,
cd.age
from #cdetails cd
where cd.cid = cd1.cid
For XML Path(''), Type
)
from #cdetails cd1
join #tbl t on cd1.cid = t.cid
For XML Path('Main')
) q(xml_data);
select * from #final;
在您的情況下,從XML中讀取數據並從頭開始重建它要容易得多:
;WITH cte AS
(
select m.value(N'(ID/text())[1]','int') AS ID
,m.value(N'(details/name)[1]','nvarchar(max)') AS DetailsName
,m.value(N'(details/age)[1]','int') AS DetailsAge
,t.ctype
from #final f
CROSS APPLY f.xml_data.nodes(N'/Main') A(m)
LEFT JOIN #tbl t ON t.cid=m.value(N'(ID/text())[1]','int') --left join, because I don't know if and ID is found as CID
)
SELECT ID
,ctype AS [type]
,DetailsName AS [details/name]
,DetailsAge AS [details/age]
FROM cte
FOR XML PATH('Main')
退貨
<Main>
<ID>1001</ID>
<type>N</type>
<details>
<name>John</name>
<age>12</age>
</details>
</Main>
<Main>
<ID>1002</ID>
<type>U</type>
<details>
<name>Rick</name>
<age>19</age>
</details>
</Main>
<Main>
<ID>1003</ID>
<type>N</type>
<details>
<name>Diane</name>
<age>25</age>
</details>
</Main>
<Main>
<ID>1004</ID>
<type>N</type>
<details>
<name>Kippy</name>
<age>26</age>
</details>
</Main>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.