Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL DML:如何更改/添加现有XML节点的父节点?_Sql Server_Xml_Tsql_Xquery - Fatal编程技术网

Sql server T-SQL DML:如何更改/添加现有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

我的数据库中有几个XML需要更新。以下是对它们的简化表示:

<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