我有两张桌子:
MasterReg
(MasterID,Revenue,Date,Desc); MasterID
是Identity
列
DetailReg
(DetailID,MasterID,NumValue); DetailID
是Identity
列
我正在尝试使用openxml
从xml字符串插入数据insert into MasterReg (Revenue, Date, Desc)
Select Revenue, Date, Desc
From OPENXML(....
这将在我的MasterReg
表
DetailReg
表包含插入MasterReg
表
e.g。对于MasterID=1
,DetailID
表格中会有六个DetailReg
(一个DetailReg
条目Master
中有六个条目)
我的XML看起来像这样:
<Root>
<Detail>
<Revenue>333300</Revenue>
<Date>21/6/2011</Date>
<Desc>desc text...</Desc>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
</Detail>
<Detail>
<Revenue>333300</Revenue>
<Date>21/6/2011</Date>
<Desc>desc text...</Desc>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
</Detail>
<Detail>
<Revenue>333300</Revenue>
<Date>21/6/2011</Date>
<Desc>desc text...</Desc>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
<NumValue value="56"/>
</Detail>
</Root>
我不想将光标用于此...第一个MasterReg
条目已成功完成,但我不知道如何将关联数据插入DetailReg
与主注册表表...
两个表最初都没有任何数据。
答案 0 :(得分:1)
我不知道是谁投票给你,但你的问题有两个优点:(1)处理XML数据结构和(2)处理主子插入而不诉诸游标。
这是MERGE
的完美工作:
SET DATEFORMAT DMY -- Your server may not need this
DECLARE @XMLString xml = '<!-- your xml goes here --!>'
DECLARE @InsertResult TABLE
(
MasterID int,
NumValueXML xml
)
MERGE MasterReg
USING (
SELECT Detail.value('Revenue[1]','int') AS Revenue,
Detail.value('Date[1]','date') AS [Date],
Detail.value('Desc[1]','varchar(200)') AS [Desc],
Detail.query('NumValue') AS NumValueXML
FROM @XMLString.nodes('/Root/Detail') tmp(Detail)
) AS src
ON 0 = 1
WHEN NOT MATCHED THEN
INSERT (Revenue, [Date], [Desc])
VALUES (src.Revenue, src.[Date], src.[Desc])
OUTPUT inserted.MasterID, src.NumValueXML
INTO @InsertResult (MasterID, NumValueXML)
;
INSERT INTO DetailReg (MasterID, NumValue)
SELECT t1.MasterID,
t2.x.value('@value','int')
FROM @InsertResult t1
CROSS APPLY t1.NumValueXML.nodes('NumValue') t2(x)
SELECT * FROM MasterReg
SELECT * FROM DetailReg
如果您需要帮助了解查询,请在评论中告诉我。