SQL Server:批量插入节点到xml加入另一个表

时间:2016-02-04 00:31:07

标签: sql-server xml

我用谷歌搜索但却无法找到一个很好的例子。 我有一个带有pk ID和十进制列的#temp表

ID    decimal
2     0.34
3     0.1

我有另一个名为master的表,其中一列具有相同的pk和xml列,如:

Master
ID    xml
2     <Form ....
3     <Form.....

我需要在xml中插入一个新元素,其元素名称为十进制值。所有具有相同元素名称且处于同一级别的。

基本级别的xml如下所示:

<Form formCode="123">
   <Node1>234</Node1>
   <Node2>234</Node3>
</Form>

我希望最终的xml看起来像:

<Form formCode="123">
   <Node1>234</Node1>
   <Node2>234</Node3>
   <NewNode>0.34</NewNode>
</Form>

我认为应该是这样的:

UPDATE Master
SET 
xml.modify('insert /Form/'...followed by some kind of join.

2 个答案:

答案 0 :(得分:2)

尝试这样的事情

DECLARE @tbl TABLE(ID INT, decimalColumn DECIMAL(4,2));
INSERT INTO @tbl VALUES
 (2,0.34)
,(3,0.1);

DECLARE @master TABLE(ID INT, xmlColumn XML);
INSERT INTO @master VALUES
(2,
'<Form formCode="123">
   <Node1>234</Node1>
   <Node2>234</Node2>
</Form>')
,(3,
'<Form formCode="456">
   <Node1>234</Node1>
   <Node2>234</Node2>
</Form>')

UPDATE @master SET xmlColumn.modify('insert sql:column("NewNode.AsXml") as last into /Form[1]')
FROM @master AS m
INNER JOIN @tbl AS tbl ON tbl.ID=m.ID
CROSS APPLY(SELECT CAST(tbl.decimalColumn AS VARCHAR(MAX)) FOR XML PATH('NewNode'),TYPE) AS NewNode(AsXml);

SELECT * FROM @master 

结果

2   <Form formCode="123"><Node1>234</Node1><Node2>234</Node2><NewNode>0.34</NewNode></Form>
3   <Form formCode="456"><Node1>234</Node1><Node2>234</Node2><NewNode>0.10</NewNode></Form>

答案 1 :(得分:1)

使用UPDATE ... FROMsql:column功能:

DECLARE @temp TABLE (id int, d decimal(10,2));

DECLARE @master TABLE  (id int, x xml);

INSERT @temp
VALUEs (2, 0.34),(3,.1);

INSERT @master 
VALUES (2, '<Form><Test /></Form>'), (3, '<Form><Test /></Form>')

UPDATE m
SET x.modify('insert <NewNode>{sql:column("d.d")}</NewNode> after (/Form/Test)[1]')
FROM @master m
INNER JOIN @temp d
ON m.id = d.id

SELECT * FROM @master