Solved

How do I partly modify xml column attribute like native sql replace

Posted on 2010-11-23
8
700 Views
Last Modified: 2012-05-10
Hi experts,

all I want to do is modify a XML Attribute value within a XML column type like the ordinary replace function.
These are my rows within the xml column

<test attr="http://www.link.com/abc"/>
<test attr="http://www.link.com/def"/>
<test attr="www.link.com/xyz"/>

Open in new window


UPDATE dbo.test
SET    testCol = replace(testCol, 'www.link.com', 'www.mylink.com')
WHERE  testCol LIKE '%www.link.com%';

Open in new window


But modifying a xml column only works through

testCol.modify('replace value of xpath-expression with new-value')

Open in new window


where I cannot use any native replace function nor xpath translate function within "new-value".

This is my needed result.
<test attr="http://www.mylink.com/abc"/>
<test attr="http://www.mylink.com/def"/>
<test attr="www.mylink.com/xyz"/>

Open in new window


Thanks in advance for your help.
0
Comment
Question by:arthrex
  • 4
  • 2
  • 2
8 Comments
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 34206486
Is this sufficient? I don't think you'll be able to do it in a single query and you will probably have to create a cursor to replace the whole table.
declare @temp varchar(128)



-------------------------------------------------------------------------------------

--  Case 1

-------------------------------------------------------------------------------------

declare @sample1 xml

set @sample1 = '<test attr="http://www.link.com/abc"/>'



set @temp = @sample1.value('(/test/@attr)[1]', 'varchar(128)')

set @temp = REPLACE(@temp, 'www.link.com', 'www.mylink.com')

set @sample1.modify('replace value of (/test/@attr)[1] with sql:variable("@temp")')



select @sample1



-------------------------------------------------------------------------------------

--  Case 2

-------------------------------------------------------------------------------------

declare @sample2 xml

set @sample2 = '<test attr="http://www.link.com/def"/>'



set @temp = @sample2.value('(/test/@attr)[1]', 'varchar(128)')

set @temp = REPLACE(@temp, 'www.link.com', 'www.mylink.com')

set @sample2.modify('replace value of (/test/@attr)[1] with sql:variable("@temp")')



select @sample2



-------------------------------------------------------------------------------------

--  Case 3

-------------------------------------------------------------------------------------

declare @sample3 xml

set @sample3 = '<test attr="www.link.com/xyz"/>'



set @temp = @sample3.value('(/test/@attr)[1]', 'varchar(128)')

set @temp = REPLACE(@temp, 'www.link.com', 'www.mylink.com')

set @sample3.modify('replace value of (/test/@attr)[1] with sql:variable("@temp")')



select @sample3

Open in new window

0
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 34206742
Maybe you won't need the cursor  :)

Make sure you size the varchar accordingly to fit the textual length of your xml field:
update Test

set data = CAST(replace(data.value('(/test/@attr)[1]', 'varchar(128)'), 'www.link.com','www.mylink.com') as xml)

Open in new window

0
 
LVL 75

Expert Comment

by:käµfm³d 👽
ID: 34206784
Disregard, the last post is not valid.
0
 
LVL 75

Assisted Solution

by:käµfm³d 👽
käµfm³d   👽 earned 100 total points
ID: 34207973
I fall back to my previous cursor comment:
declare cur cursor
	for select data from test
	for update of data

declare @sample1 xml
declare @temp varchar(128)
	
open cur;

fetch next from cur
	into @sample1
	
while @@FETCH_STATUS = 0
begin
	set @temp = @sample1.value('(/test/@attr)[1]', 'varchar(128)')
	set @temp = REPLACE(@temp, 'www.link.com', 'www.mylink.com')
	set @sample1.modify('replace value of (/test/@attr)[1] with sql:variable("@temp")')
	
	update Test set data = @sample1
		where current of cur
	
	fetch next from cur
		into @sample1
end

close cur
deallocate cur

select * from Test

Open in new window

0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 

Author Comment

by:arthrex
ID: 34208614
Hello kaufmed,

are you sure that it is not possible to solve it within a single query?
I also thought about a procedure in the first place but I need to call the update without modifying the procedures on the database ;)

But thank you very much for the cursor example.
0
 
LVL 19

Accepted Solution

by:
Bhavesh Shah earned 400 total points
ID: 34220982
Hi,

check out this
create table #table1
(
col xml
)
insert into #table1
values
('<test attr="http://www.link.com/abc"/>')
insert into #table1
values
('<test attr="http://www.link.com/def"/>')
insert into #table1
values
('<test attr="www.link.com/xyz"/>')

select * from #table1

UPDATE dbo.#table1
SET    col = replace(cast(Col as varchar(max)), 'www.link.com', 'www.mylink.com')
where cast(Col as varchar(max)) LIKE '%www.link.com%';

select * from #table1

Open in new window

0
 

Author Closing Comment

by:arthrex
ID: 34256105
So simple ;)

Still one question. Is mssql2005 autocasting the replaced varchar(max) back into valid xml (
set col = replace(cast(col as varchar(max)),'','') )?

Best regards and thanks!
0
 
LVL 19

Expert Comment

by:Bhavesh Shah
ID: 34256557
Hi.....

Yes....if mssql can not do casting then it will throw an error....

0

Featured Post

[Webinar] Disaster Recovery and Cloud Management

Learn from Unigma and CloudBerry industry veterans which providers are best for certain use cases and how to lower cloud costs, how to grow your Managed Services practice in IaaS clouds, and how to utilize public cloud for Disaster Recovery

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Insert with SET how to handle join 6 57
Convert char to decimal in a SQL Server View 14 45
sql query help 4 45
email about the whoisactive result 7 25
If you find yourself in this situation “I have used SELECT DISTINCT but I’m getting duplicates” then I'm sorry to say you are using the wrong SQL technique as it only does one thing which is: produces whole rows that are unique. If the results you a…
In this article we will get to know that how can we recover deleted data if it happens accidently. We really can recover deleted rows if we know the time when data is deleted by using the transaction log.
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
Many functions in Excel can make decisions. The most simple of these is the IF function: it returns a value depending on whether a condition you describe is true or false. Once you get the hang of using the IF function, you will find it easier to us…

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now