테이블의 SQL Server XML 데이터 열에 일부 데이터가 저장되어 있습니다. 그것은 HTML 콘텐트 (전자 메일로 전송 됨)을 구성하는 데 사용되며 정상적으로 작동합니다. 그러나 지금은 일부 데이터를 변경하고 싶지만 원하는 비트 만 적용하려면 올바른 주문을 찾지 못하는 것 같습니다.SQL XML 열의 노드 내용을 수정하려면 어떻게합니까?
다음 예를 참조하십시오.
declare @s1 varchar(max);
declare @s2 varchar(max);
declare @s3 varchar(max);
-- rough approximation of my data
set @s1 = '<email sender="bob"><html><body><table><tbody><tr><td><b>'
set @s2 = '</b></td></tr><tr><td><b>'
set @s3 = '</b></td></tr></tbody></table></body></html></email>'
declare @t table (id int, data xml)
insert into @t values (1, @s1 + 'Hello World' + @s2 + 'Goodbye cruel world' + @s3)
insert into @t values (2, @s1 + 'Hello World' + @s2 + 'I''m leaving you today' + @s3)
insert into @t values (3, @s1 + 'Hello World' + @s2 + 'Goodbye, goodbye, goodbye' + @s3)
select data from @t
update @t -- change sender to "fred"
set data.modify('replace value of (/email/@sender)[1] with "fred"')
select data from @t
select data,x.nd.value('b[1]','varchar(max)') -- find the "hello world" bits
from @t
cross apply data.nodes('email/html/body/table/tbody/tr/td') as x(nd)
where x.nd.value('b[1]','varchar(max)') = 'Hello World'
내가을 (내가 밖으로 일을했다고 생각)은 "보낸 사람"데이터 하고 "안녕하세요"데이터를 변경하려면 - 내가 찾을 수 있습니다,하지만 난 방법을 모르는 변화. 나는 "크로스 적용"문법으로 어떤 일이 벌어지는 지 잘 모르겠다. XPath 만 쓰면 "where"절없이 "Hello World"노드 만 찾을 수있을 것이라고 생각한다.
내 테이블에는 약 9 개의 행만 있습니다. 따라서 필요한 경우 9 개의 업데이트 명령을 쓸 수 있으며 이는 일회성 데이터 유지 관리 작업입니다.
도움을 주시면 감사하겠습니다.
편집 :
는 그 일이이 방법이 있나요?
update @t
set data.modify('replace value of (email/html/body/table/tbody/tr/td/b/text())[1] with "bonjour monde"')
from @t
cross apply data.nodes('email/html/body/table/tbody/tr/td') as x(nd)
where x.nd.value('b[1]','varchar(max)') = 'Hello World'
감사합니다.
팁을 보내 주셔서 감사합니다. XPath 필터. –