我有以下XML:
create table #temp(cid int,xml_data xml)
insert into cid
values(1001,
'<Main>
<name>''John doe''</name>
<age>15</age>
</Main>')
我想基于一个简单的参数条件向此XML添加一个附加节点:
所需的输出:
<Main>
<name>John doe</name>
<type>Q</type>
<age>15</age>
</Main>
代码:
select case when @type = 'Q' then
UPDATE #temp
SET Main.modify('insert <type = 'Q'> into
(/Main)')
GO
我收到语法错误。任何帮助!
更新:
我在代码中实现了建议的解决方案,但出现错误。错过了一些愚蠢的东西!
UPDATE #temp
SET xml_data =
case
when @type = 'G'
then xml_data.modify('insert <type>G</type> into (/Main)[1]');
when @type = 'Q'
then xml_data.modify('insert <type>Q</type> into (/Main)[1]'); end
我得到“ XML数据类型方法的错误使用”修改”。在这种情况下,期望使用非突变方法。”错误
答案 0 :(得分:2)
我能够通过将更新分为两个语句来实现此目的:
create table #temp(cid int,xml_data xml)
insert into #temp
values(1001,
'<Main>
<name>''John doe''</name>
<age>15</age>
</Main>')
UPDATE #temp
SET xml_data.modify('insert <type /> into (/Main)[1]')
GO
declare @variable xml = 'q'
UPDATE #temp
set xml_data.modify('insert sql:variable("@variable") as last into (/Main/type)[1]')
GO
select * from #temp
答案 1 :(得分:2)
不需要任何复杂的麻烦。只需插入所需的节点即可:
UPDATE #temp SET xml_data.modify('insert <type>Q</type> into (/Main)[1]');
使用as first
,as last
或before / after
可以指定节点的位置。以下将新节点直接放在<name>
之后:
UPDATE #temp SET xml_data.modify('insert <type>Q</type> after (/Main/name)[1]');
您的陈述有几个缺陷:
UPDATE #temp SET xml_data = case when @type = 'G' then xml_data.modify('insert <type>G</type> into (/Main)[1]'); when @type = 'Q' then xml_data.modify('insert <type>Q</type> into (/Main)[1]'); end
您不能使用语法SET xmlColumn = xmlColumn.modify()
。您必须使用SET xmlColumn.modify()
,而且分号还是会破坏这一点。
说实话,我认为这很复杂,请尝试以下方法:
DECLARE @type VARCHAR(1)='Q'
UPDATE #temp SET xml_data.modify('insert <type>{sql:variable("@type")}</type> into (/Main)[1]');
这将创建一个新节点<type>content</type>
,其内容来自变量@type
。