在SQL Server中更新空XML标记

min*_*int 8 xml sql

我正在尝试在sql server上更新我的Xml字符串中的空XML标记; 它表示当我运行以下脚本时更新行,但是当我查看XML时; 什么也没有变:

Declare @newValue varchar(100)
select @newValue = '01'

    update dbo.UploadReport
    set XmlTest.insert('replace value of (/CodeFiveReport/Owner/AgencyID/text())[1] with sql:variable("@newValue")') 
    where id = 'myId'
Run Code Online (Sandbox Code Playgroud)

在数据库中仍然显示为xml

<AgencyID />

我究竟做错了什么?

我在最后没有文本()的情况下尝试了@AgencyID,仍然无济于事......

小智 13

使用Sql Server 2005

declare @var varchar(100)
set @var = '1234'
Run Code Online (Sandbox Code Playgroud)

- 将空格插入空元素

update dbo.UploadReport 
set Form_XML.modify('insert text{" "} into (/CodeFiveReport/Owner/AgencyID/[not(text())])[1]')
WHERE id = 'myId'
Run Code Online (Sandbox Code Playgroud)

- 现在我们有了一个text()节点,你可以使用替换w /你的变量

update dbo.UploadReport 
set FORM_XML.modify('replace value of (/CodeFiveReport/Owner/AgencyID/text())[1] with sql:variable("@var")')
WHERE id = 'myId'
Run Code Online (Sandbox Code Playgroud)

  • +1但我认为,在第一个查询中,"AgencyID"之后的"/"不正确.它会导致语法错误.它应该是:将text {""}插入(/ CodeFiveReport/Owner/AgencyID [not(text())])[1]').我试图删除它,但编辑必须至少6个字符:/ (2认同)

mar*_*c_s 11

据我所知,根据我自己的经验,你不能一步到位,因为<AgencyID/>元素真的没有text()- 所以你不能替换它.

您可能必须使用以下内容:

DECLARE @newValue VARCHAR(100)
SELECT @newValue = '01'

-- first update - add a new <AgencyID>...</AgencyID> node    
UPDATE dbo.UploadReport
SET XmlTest.modify('insert <AgencyID>{sql:variable("@newValue")}</AgencyID> as last into (/CodeFiveReport/Owner)[1]') 
WHERE id = 'myId'

-- second update - remove the empty <AgencyID /> node    
UPDATE dbo.UploadReport
SET XmlTest.modify('delete (/CodeFiveReport/Owner/AgencyID)[1]') 
WHERE id = 'myId'
Run Code Online (Sandbox Code Playgroud)

一件事:你需要使用这个XmlTest.modify操作 - 而不是XmlTest.insert你的帖子..insert()SQL Server XML列上没有任何功能.


小智 5

直接将值更新为空元素应该是这样的:-

update dbo.UploadReport  
set Form_XML.modify('insert text{sql:variable("@var")} into (/CodeFiveReport/Owner/AgencyID)[1]') 
WHERE id = 'myId' 
Run Code Online (Sandbox Code Playgroud)