【问题标题】:SQL check XML node exists via a variable, add & deleteSQL检查XML节点通过变量是否存在,添加和删除
【发布时间】: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")]') 

但无法使删除工作。

【问题讨论】:

    标签: sql xml


    【解决方案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")]')
    

    我提问和回答的原因是因为我想处理节点名称,而不是属性值。

    【讨论】:

    • 哇,经过一天的搜索,您的代码对我有用。谢谢。
    • @MarceloBarbosa 哇,这是不久前的事了,不客气,很高兴它也对你有用。你不就是喜欢这样吗。
    猜你喜欢
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多