更新(替换部分值)XML SQL 中的列
Update(Replace partcial value) XML Column in SQL
我的 Table 中有一个 XML 列,我想用新文本替换该列中出现的特定文本。这里是xml结构,
<Story>
<StoryNonText>
<NonText>
<ImageID>1</ImageID>
<Src>http://staging.xyz.com/FolderName/1.png</Src>
</NonText>
<NonText>
<ImageID>2</ImageID>
<Src>http://staging.xyz.com/FolderName/2.png</Src>
</NonText>
</StoryNonText>
</Story>
在上面的 XML 中,我想替换所有具有 http://staging.xyz.com/ to http://production.xyz.com/ 的 <Src>
值。请指导我如何做到这一点!
有很多方法可以做到这一点。
第一种方法是添加一个WHILE循环。在一个循环中,您搜索 (CHARINDEX) 以查找第一个标签和第一个标签的位置。然后,知道开始和结束位置,替换值。然后在下一次迭代中再次搜索,但更改 CHARINDEX() 函数中的起始位置
第二种方法是使用SELECT ... FROM OPENXML + EXEC sp_xml_preparedocument
您可以使用 Replace() 函数,如下所示:
Update TableName
SET
ColumnName=replace(CAST(ColumnName AS VARCHAR(8000)),'<Src>http://staging.xyz.com/','<Src>http://production.xyz.com/')
在几个 XML 函数的帮助下,您可以在循环中执行此操作。
循环是必要的,因为 replace value of
一次只能替换一个值。此代码假定 URL 首先位于节点中,而不是嵌入任何文本中。
declare @T table(X xml);
insert into @T(X) values('<Story>
<StoryNonText>
<NonText>
<ImageID>1</ImageID>
<Src>http://staging.xyz.com/FolderName/1.png</Src>
</NonText>
<NonText>
<ImageID>2</ImageID>
<Src>http://staging.xyz.com/FolderName/2.png</Src>
</NonText>
</StoryNonText>
</Story> ');
declare @FromURL nvarchar(100);
declare @ToURL nvarchar(100);
set @FromURL = 'http://staging.xyz.com/';
set @ToURL = 'http://production.xyz.com/';
while 1 = 1
begin
update @T
set X.modify('replace value of (//*/text()[contains(., sql:variable("@FromURL"))])[1]
with concat(sql:variable("@ToURL"), substring((//*/text()[contains(., sql:variable("@FromURL"))])[1], string-length(sql:variable("@FromURL"))+1))')
where X.exist('//*/text()[contains(., sql:variable("@FromURL"))]') = 1;
if @@rowcount = 0
break;
end;
select *
from @T
replace value of (XML DML)
concat Function (XQuery)
contains Function (XQuery)
string-length Function (XQuery)
sql:variable() Function (XQuery)
我的 Table 中有一个 XML 列,我想用新文本替换该列中出现的特定文本。这里是xml结构,
<Story>
<StoryNonText>
<NonText>
<ImageID>1</ImageID>
<Src>http://staging.xyz.com/FolderName/1.png</Src>
</NonText>
<NonText>
<ImageID>2</ImageID>
<Src>http://staging.xyz.com/FolderName/2.png</Src>
</NonText>
</StoryNonText>
</Story>
在上面的 XML 中,我想替换所有具有 http://staging.xyz.com/ to http://production.xyz.com/ 的 <Src>
值。请指导我如何做到这一点!
有很多方法可以做到这一点。
第一种方法是添加一个WHILE循环。在一个循环中,您搜索 (CHARINDEX) 以查找第一个标签和第一个标签的位置。然后,知道开始和结束位置,替换值。然后在下一次迭代中再次搜索,但更改 CHARINDEX() 函数中的起始位置
第二种方法是使用SELECT ... FROM OPENXML + EXEC sp_xml_preparedocument
您可以使用 Replace() 函数,如下所示:
Update TableName
SET
ColumnName=replace(CAST(ColumnName AS VARCHAR(8000)),'<Src>http://staging.xyz.com/','<Src>http://production.xyz.com/')
在几个 XML 函数的帮助下,您可以在循环中执行此操作。
循环是必要的,因为 replace value of
一次只能替换一个值。此代码假定 URL 首先位于节点中,而不是嵌入任何文本中。
declare @T table(X xml);
insert into @T(X) values('<Story>
<StoryNonText>
<NonText>
<ImageID>1</ImageID>
<Src>http://staging.xyz.com/FolderName/1.png</Src>
</NonText>
<NonText>
<ImageID>2</ImageID>
<Src>http://staging.xyz.com/FolderName/2.png</Src>
</NonText>
</StoryNonText>
</Story> ');
declare @FromURL nvarchar(100);
declare @ToURL nvarchar(100);
set @FromURL = 'http://staging.xyz.com/';
set @ToURL = 'http://production.xyz.com/';
while 1 = 1
begin
update @T
set X.modify('replace value of (//*/text()[contains(., sql:variable("@FromURL"))])[1]
with concat(sql:variable("@ToURL"), substring((//*/text()[contains(., sql:variable("@FromURL"))])[1], string-length(sql:variable("@FromURL"))+1))')
where X.exist('//*/text()[contains(., sql:variable("@FromURL"))]') = 1;
if @@rowcount = 0
break;
end;
select *
from @T
replace value of (XML DML)
concat Function (XQuery)
contains Function (XQuery)
string-length Function (XQuery)
sql:variable() Function (XQuery)