Sql server T-SQL DML:如何更改/添加现有XML节点的父节点?
我的数据库中有几个XML需要更新。以下是对它们的简化表示:Sql server T-SQL DML:如何更改/添加现有XML节点的父节点?,sql-server,xml,tsql,xquery,Sql Server,Xml,Tsql,Xquery,我的数据库中有几个XML需要更新。以下是对它们的简化表示: <root> <child1>blah</child1> </root> 废话 我需要用另一个元素包装,以获得如下结构: <root> <child1Root> <child1>blah</child1> </child1Root> </root> 废话 看起来很简单,但我不是T-SQL
<root>
<child1>blah</child1>
</root>
废话
我需要用另一个元素包装
,以获得如下结构:
<root>
<child1Root>
<child1>blah</child1>
</child1Root>
</root>
废话
看起来很简单,但我不是T-SQL和DML专家
注意:如果有人想知道为什么要更新,答案是下面的XML不能使用DataContractSerializer反序列化。可以使用XmlSerializer和XmlArray属性反序列化,但不能使用DCS:
<root>
<child1>blah</child1>
<child2>blah</child2>
</root>
废话
废话
暴力法:
DECLARE @myDoc xml
SET @myDoc = '
<root>
<child1>blah</child1>
</root>'
SELECT @myDoc
DECLARE @child1 xml;
SET @child1 = @myDoc.query('/root/child1')
SELECT @child1
SET @myDoc.modify('
insert <child1Root />
into (/root)[1]')
SELECT @myDoc
SET @myDoc.modify('
insert sql:variable("@child1")
into (/root/child1Root)[1]')
SELECT @myDoc
SET @myDoc.modify('
delete /root/child1')
SELECT @myDoc
DECLARE@mydocxml
设置@myDoc=
废话
'
选择@myDoc
声明@child1xml;
SET@child1=@myDoc.query('/root/child1')
选择@child1
SET@myDoc.modify('
插入
进入(/root)[1]')
选择@myDoc
SET@myDoc.modify('
插入sql:变量(“@child1”)
进入(/root/child1Root)[1]')
选择@myDoc
SET@myDoc.modify('
删除/root/child1')
选择@myDoc
这是一个工作示例。考虑到有效的XML有严格的规则,我想不出为什么字符串操作不起作用。至少,“如果您的实际代码与示例一样简单,那么您可以这样做:
DECLARE @yourTable TABLE ( yourXML XML )
INSERT INTO @yourTable ( yourXML )
VALUES
( '<root><child1>blah1</child1></root>' ),
( '<root><child1>blah2</child1></root>' )
UPDATE @yourTable
SET yourXML = yourXML.query('root/child1').query('<root><child1Root>{.}</child1Root></root>')
SELECT * FROM @yourTable
DECLARE@yourTable表(yourXML)
插入@yourTable(yourXML)
价值观
(“blah1”),
(‘废话’)
更新@yourTable
设置yourXML=yourXML.query('root/child1').query(“{.}”)
从@yourTable中选择*
如果您的真实XML有点复杂,那么您可能需要将其分解。是的,这不会很快运行。是的,可以改进循环(它每次都处理所有记录)。对于使用纯T-SQL完成的一次性解决方案,它已经足够好了。请随意编辑和改进,我们毕竟是在StackOverflow上。啊!我喜欢
{.}
这件事。是XQuery subst吗?是的,。是“self::node()”的缩写。如果child1是复杂的元素,请参阅wBob答案如何选取其子元素。
DECLARE @yourTable TABLE ( yourXML XML )
INSERT INTO @yourTable ( yourXML )
VALUES
( '<root><child1>blah1</child1></root>' ),
( '<root><child1>blah2</child1></root>' )
UPDATE @yourTable
SET yourXML = yourXML.query('root/child1').query('<root><child1Root>{.}</child1Root></root>')
SELECT * FROM @yourTable