我有一个现有的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]')
答案 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