【问题标题】:SQL Server: bulk insert node into xml joined to another tableSQL Server:将节点批量插入到连接到另一个表的 xml 中
【发布时间】:2016-02-04 16:53:12
【问题描述】:

我用谷歌搜索过,但找不到一个很好的例子。 我有一个带有 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.

【问题讨论】:

  • 请提供更多信息。尤其是您的 XML 的外观(&lt;Form... 还不够)以及您要插入的方式和内容。
  • 添加xml前后
  • 好的,好多了,但是你确定你想要你的节点命名吗?通常这些节点都具有相同的名称。它们的“索引”来自它们在树中的位置。另一种方法是在节点中设置属性...我不会在这里使用不同的节点名称...
  • 这些不是我的 xml 中节点的实际名称,只是本示例的示例。

标签: sql-server xml


【解决方案1】:

试试这样的

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>

【讨论】:

  • 抱歉,忘记了演员表...效果是一个名为“NewNode/decimalColumn”的新节点...
【解决方案2】:

使用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

【讨论】:

  • 使用{...} 直接使用sql:column() 对我来说是新事物...谢谢,值得一票!
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多