无法更新数据库列中的xml字段

时间:2014-04-25 22:17:51

标签: sql-server xml

我有一个现有的xml字段。我想使用Microsoft Sql Server Management Studio更新该字段。我知道修改功能与替换但它没有按我的意愿工作。我使用以下链接作为参考,我已经模仿了它,但它只是创建了自己的xml值。

也许这甚至有帮助,我有一个数据库。在数据库中,我有列a,b,c。在列c中是一个xml文件。我想更新c列中的xml文件的字段。

http://technet.microsoft.com/en-us/library/ms190675.aspx

 declare @a xml

 select @a = convert(xml,[example]).value(
 '(/root/x/y)[1]', 'varchar(5)') 
 from --
 left join -- on -- = --
 where 1=1 and -- = -- and -- = --

 --update rev.REV_SECURITY_DEFAULT
 set @a.modify('
 replace value of (/root/x/@y)[1]
 with "0"')
 select @a

 --new
 SET @a = '<Root>
 <x LocationID="10">
  <y>Manufacturing step 1 at this work center</y>
  </x>
 </Root>'
 SELECT @myDoc
 --update rev.REV_SECURITY_DEFAULT
 set @a.modify('
 replace value of (/root/x/@y)[1]
 with "0"')
 select @a

--UPDATE

select NAME, NAMESPACE, ---
from --
left join -- on -- = --
where 1=1 and --.NAMESPACE = '--' and--.name = '--' 
go

DECLARE @a xml = N'<root><x y="2"/></root>';
SELECT @a;

SET @a.modify('replace value of (/root/x/@y)[1] with "42"');
SELECT @a;

尝试将ntext强制转换为xml时遇到的新问题。它没有投射它仍然给我cannot call methods on ntext

SELECT CAST(a.column_name AS XML)
from a

update a

set a.modify('replace value of (/x/y/@z)[1] with "0"') 

现在我需要在xml文件中插入一个元素。我尝试以下操作,但在&#39;)附近得到错误&#34;语法错误&#39;,期望一个步骤表达&#34;。

update #tmp set permissions.modify('insert <EXAMPLE></EXAMPLE> into (/SECURITY/)[1]')

1 个答案:

答案 0 :(得分:3)

将@a的值正确设置为xml片段而不是值后,如果y是属性,则语法类似于:

DECLARE @a xml = N'<root><x y="2"/></root>';
SELECT @a;

SET @a.modify('replace value of (/root/x/@y)[1] with "42"');
SELECT @a;

收益<root><x y="42"/></root>

如果y是您的语法元素:

DECLARE @a xml = N'<root><x><y>hello</y></x></root>';
SELECT @a;

SET @a.modify('replace value of (/root/x/y/text())[1] with "world"');
SELECT @a;

收益<root><x><y>world</y></x></root>

将此应用于表格,以下是将按原样运行的示例代码:

DECLARE @T TABLE(NS varchar(32), NM varchar(16), DocXml xml)
INSERT INTO @T 
  VALUES ('MyNamespace1', 'MyName1', N'<root><x y="2"/></root>'),
         ('MyNamespace2', 'MyName2', N'<root><x y="2"/></root>')

UPDATE @T SET DocXml.modify('replace value of (/root/x/@y)[1] with "42"')
 WHERE NS = 'MyNamespace1' AND NM = 'MyName1';

SELECT * FROM @T     

然而,如果&#39; xml&#39; column是一个带有xml数据的文本列,而不是作为xml键入的,不能同时强制转换为xml并在一个update语句中调用modify。您应该考虑将表列更改为xml类型,或添加xml列。

假设您的原始表具有唯一ID:

,这将是一种解决方法
-- represents original table...
CREATE TABLE T(Id int, NS varchar(32), NM varchar(16), DocXml ntext)
INSERT INTO T 
  VALUES (1, 'MyNamespace1', 'MyName1', N'<root><x y="2"/></root>'),
         (2, 'MyNamespace2', 'MyName2', N'<root><x y="2"/></root>');

-- select target records into tempdb
SELECT Id, CAST(DocXml AS xml) AS DocXml INTO #tmp FROM T WHERE NS = 'MyNamespace1' AND NM = 'MyName1';

-- update tempdb
UPDATE #tmp SET DocXml.modify('replace value of (/root/x/@y)[1] with "42"');

-- and copy back to original table
    UPDATE T
       SET DocXml = CAST(U.DocXml AS nvarchar(MAX))
      FROM dbo.T TT
INNER JOIN #tmp U ON TT.Id = U.Id

SELECT * FROM T