【发布时间】:2014-04-21 11:58:57
【问题描述】:
我正在寻找一种方法来使用 MSSQL 2012 检查 xml 数据类型中是否存在节点,我想通过节点以将其作为 varchar 检查到存储过程中。我已经尝试过类似下面的方法,但它似乎不起作用。我想要做的是寻找节点“var2”(作为varchar传递到SP中),如果它存在则返回true,如果它不存在则将其插入根。我发现的所有示例都对节点进行了硬编码,可以正常工作。
以节点为变量的代码:
declare @node varchar(255)
declare @x xml
set @node = 'var2'
set @x='<root><var1>0</var1><var2>123</var2><var3>1000</var3><var4>989</var4></root>'
select @x.exist('//.[node()=(sql:variable("@node"))]') -- always returns false
带有硬编码节点的代码:
select @x.exist('//var2') -- returns true
如果节点存在则返回true,否则将节点插入根元素。
编辑:
我已经确定我可以做到以下几点:
select @x.exist('//*[local-name()=sql:variable("@node")]') -- returns 1 if node exists
如果节点不存在,我可以添加一个新节点:
set @add = '<newNode>test</newNode>'
@x.modify('insert sql:variable("@add") into (/root)[1]')
我可以通过以下方式删除现有节点:
set @del ='newNode'
@x.modify('delete /root/*[local-name()=sql:variable("@del")]')
但无法使删除工作。
【问题讨论】: