2012-09-21 5 views
2

데이터베이스에 User라는 테이블이 있습니다. XmlText라는 이름의 xml 열에 많은 특성이 포함되어 있습니다. 할 필요가 무엇SQL Server에서 Xml 열 특성 조작

<userDetails> 
    <MobileVerified>True</MobileVerified> 
    <EmailVerified>True</EmailVerified> 
    <IPAddress>122.160.65.232</IPAddress> 
    <Gender>Male</Gender> 
    <DateOfBirth>1970-03-22T00:00:00</DateOfBirth> 
    <DealingInProperties>residential_apartment_flat</DealingInProperties> 
    <DealingInProperties>residential_villa_bungalow</DealingInProperties> 
    <DealingInProperties>residential_farm_house</DealingInProperties> 
</userDetails> 

내가 'residential_apartment_flat'는 XMLTEXT 열 다른 'residential_apartment_flat'에있는 경우 기본적으로 남아있을 것입니다 'residential_apartment_flat'모든 'residential_villa_bungalow'값을 병합해야합니다. 데이터베이스에는 약 700000 개의 레코드가 있으므로 중간에 커서가 정상적인 업데이트와 커서 사이에 어떤 기술을 사용할 수 있는지 확인하십시오. 다음 열

화재 쿼리 "사용자 ID, XMLTEXT"

가능성있는 논리는이 같은 일 WUD ..

if ('residential_villa_bungalow') exists 
(
if ('residential_apartment_flat') exists 
    remove the 'residential_villa_bungalow' node as there must be only one 'residential_apartment_flat' node 
else 
    update 'residential_villa_bungalow' into 'residential_apartment_flat' 
) 

답변

1

XML Data Modification Language (XML DML)

-- Delete bungalow where already exist a flat 
update YourTable 
set XMLText.modify('delete /userDetails/DealingInProperties[. = "residential_villa_bungalow"] ') 
where XMLText.exist('/userDetails[DealingInProperties = "residential_apartment_flat"]') = 1 and 
     XMLText.exist('/userDetails[DealingInProperties = "residential_villa_bungalow"]') = 1 

-- Change value from bungalow to flat 
update YourTable 
set XMLText.modify('replace value of (/userDetails/DealingInProperties[. = "residential_villa_bungalow"]/text())[1] 
         with "residential_apartment_flat"') 
where XMLText.exist('/userDetails[DealingInProperties = "residential_villa_bungalow"]') = 1 
관련 문제