Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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检查XML节点通过变量add&;存在;删除_Sql_Xml - Fatal编程技术网

SQL检查XML节点通过变量add&;存在;删除

SQL检查XML节点通过变量add&;存在;删除,sql,xml,Sql,Xml,我正在寻找一种使用MSSQL 2012检查xml数据类型中是否存在节点的方法,我希望通过该节点将varchar作为varchar检查到存储过程中。我试过下面的方法,但似乎不起作用。我要做的是查找节点“var2”(作为varchar传递到SP),如果它存在,则返回true,如果它不存在,则将其插入根目录。我发现的所有示例都对节点进行了硬编码,这很有效 以节点作为变量的代码: declare @node varchar(255) declare @x xml set @node = 'var2'

我正在寻找一种使用MSSQL 2012检查xml数据类型中是否存在节点的方法,我希望通过该节点将varchar作为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
若节点存在,则返回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]') 

但是无法使删除生效。

我已经找到了我自己问题的答案:

--To check if a NODE exists
declare @node varchar(255)
set @node ="existingnode"
select @x.exist('//*[local-name()=sql:variable("@node")]')

--To ADD a new Node:
declare @add as xml
set @add='<abc>testingtesting</abc>'
@x.modify('insert sql:variable("@add") into (/root)[1]')

-- To Delete a node:
declare @del as varchar(255)
set @del='abc'
@x.modify('delete /root/*[local-name()=sql:variable("@del")]')
--检查节点是否存在
声明@node varchar(255)
set@node=“existingnode”
选择@x.exist('/*[local-name()=sql:variable(“@node”)]”)
--要添加新节点,请执行以下操作:
将@add声明为xml
设置@add='testingtesting'
@x、 修改('insert sql:variable(@add')到(/root)[1]')
--要删除节点,请执行以下操作:
将@del声明为varchar(255)
设置@del='abc'
@x、 修改('delete/root/*[local-name()=sql:variable(“@del”)]”)

我之所以要提问和回答,是因为我想处理节点名称,而不是属性值。

Wow,经过一天的搜索,您的代码对我很有用。谢谢你。@MarceloBarbosa哇,这是一段时间以前的事了,不客气,很高兴它也对你有用。你难道不爱我吗。
set @del ='newNode'
@x.modify('delete /root/*[local-name()=sql:variable("@del")]') 
--To check if a NODE exists
declare @node varchar(255)
set @node ="existingnode"
select @x.exist('//*[local-name()=sql:variable("@node")]')

--To ADD a new Node:
declare @add as xml
set @add='<abc>testingtesting</abc>'
@x.modify('insert sql:variable("@add") into (/root)[1]')

-- To Delete a node:
declare @del as varchar(255)
set @del='abc'
@x.modify('delete /root/*[local-name()=sql:variable("@del")]')