2011-05-10 3 views
6

XML 형식이 아닌 ntext 데이터 형식의 열이 있습니다. 그것은 모든 XML 데이터를 저장합니다. 레코드에서 xml 노드를 업데이트해야합니다. "xml 데이터 형식 메서드 'modify'의 잘못된 사용.이 컨텍스트에서는 변형되지 않은 메서드가 필요합니다."라는 오류가 발생합니다.XML 노드 값을 기반으로 레코드에서 XML을 업데이트하는 SQL 업데이트 쿼리?

begin transaction 
declare @Cps_Id int; 
set @Cps_Id = 236; 
declare @Cps_Message nvarchar(1024); 
set @Cps_Message = 'updating cpsia message with smoking'; 

update table_name 
set column_name = CONVERT(xml,column_name).modify('replace value of (/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@Cps_Id")]/CpsiaMessage/text())[1] with sql:variable("@Cps_Message")') 
WHERE Convert(xml,column_name).exist('/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@Cps_Id")]')=1 

rollback 

샘플 XML :

<root> 
    <ProductInformation> 
    <Name> Truck with Battery Charger</Name> 
    <Description>Fr.</Description> 
    <CPSIA> 
     <CpsiaDetails> 
     <Item> 
      <CpsiaId>456</CpsiaId> 
      <CpsiaMessage>waring</CpsiaMessage> 
     </Item> 
     <Item> 
      <CpsiaId>236</CpsiaId> 
      <CpsiaMessage>to health</CpsiaMessage> 
     </Item> 
     </CpsiaDetails> 
    </CPSIA> 
    </ProductInformation> 
</root> 

답변

6

당신은 XML 데이터 유형에 대한 수정 방법을 사용해야합니다.

begin transaction 
declare @Cps_Id int; 
set @Cps_Id = 236; 
declare @Cps_Message nvarchar(1024); 
set @Cps_Message = 'updating cpsia message with smoking'; 

select id, CONVERT(xml,[text]) txt into #tmp from SO5954359 

select * from #tmp 

update #tmp 
set txt.modify('replace value of (/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@Cps_Id")]/CpsiaMessage/text())[1] with sql:variable("@Cps_Message")') 

select * from #tmp 

drop table #tmp 
rollback 

그런 다음 업데이트 된 임시 테이블을 키의 원래 테이블에 조인하여 원본 테이블을 업데이트 할 수 있습니다.

+0

"xml 데이터 형식 메서드 'modify'를 잘못 사용하면 오류가 발생합니다.이 컨텍스트에서는 변형되지 않은 메서드가 필요합니다." 임시 테이블을 사용하지 않고 테이블로 단일 업데이트 쿼리를 수정했을 때 .... – DotNetDeveloper

+0

하나의 직접 업데이트 쿼리가 작동하지 않는 경우 "샘플을 게시 할 수 있습니다. 그러면 업데이트 된 임시 테이블에 가입하여 원래 테이블을 업데이트 할 수 있습니다 테이블의 원래 테이블에 키를. " – DotNetDeveloper

+0

위의 코드를 솔루션으로 업데이트하여 가장 가까운 코드를 얻고 시간을내어 주셔서 감사합니다. – DotNetDeveloper

관련 문제