Share via


replace value of(XML DML)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

문서에서 노드 값을 업데이트.

Syntax

replace value of Expression1   
with Expression2  

참고 항목

SQL Server 2014(12.x) 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조 하세요.

인수

Expression1
값을 업데이트할 노드를 식별합니다. 단일 노드만 식별해야 합니다. 즉, Expression1 은 정적 싱글톤이어야 합니다. XML을 입력하는 경우 노드의 형식은 단순 형식이어야 합니다. 여러 노드를 선택하면 오류가 발생합니다. Expression1이 빈 시퀀스를 반환하는 경우 값 대체가 발생하지 않고 오류가 반환되지 않습니다. Expression1 은 단순 형식 콘텐츠(목록 또는 원자성 형식), 텍스트 노드 또는 특성 노드가 있는 단일 요소를 반환해야 합니다. Expression1 은 공용 구조체 형식, 복합 형식, 처리 명령, 문서 노드 또는 주석 노드일 수 없거나 오류가 반환됩니다.

Expression2
노드의 새 값을 식별합니다. data()가 암시적으로 사용되기 때문에 단순 형식 노드를 반환하는 식일 수 있습니다. 값이 값 목록인 경우 update 문은 이전 값을 목록으로 바꿉니다. 형식화된 XML 인스턴스를 수정할 때 Expression2는 식1의 형식이나 하위 형식이어야 합니다. 그렇지 않으면 오류가 반환됩니다. 형식화되지 않은 XML 인스턴스 를 수정할 때 Expression2 는 원자화할 수 있는 식이어야 합니다. 그렇지 않으면 오류가 반환됩니다.

예제

replace value of XML DML 문의 다음 예제에서는 XML 문서에서 노드를 업데이트하는 방법을 보여줍니다.

A. XML 인스턴스의 값 바꾸기

다음 예제에서는 먼저 문서 인스턴스가 xml 형식의 변수에 할당됩니다. 그런 다음 XML DML 문의 값을 바꿔 문서의 값을 업데이트합니다.

DECLARE @myDoc XML;  
SET @myDoc = '<Root>  
<Location LocationID="10"   
            LaborHours="1.1"  
            MachineHours=".2" >Manufacturing steps are described here.  
<step>Manufacturing step 1 at this work center</step>  
<step>Manufacturing step 2 at this work center</step>  
</Location>  
</Root>';  
SELECT @myDoc;  
  
-- update text in the first manufacturing step  
SET @myDoc.modify('  
  replace value of (/Root/Location/step[1]/text())[1]  
  with "new text describing the manu step"  
');  
SELECT @myDoc;  
-- update attribute value  
SET @myDoc.modify('  
  replace value of (/Root/Location/@LaborHours)[1]  
  with "100.0"  
');  
SELECT @myDoc;  

업데이트되는 대상은 식 끝에 "[1]"을 추가하여 경로 식에 명시적으로 지정된 하나의 노드여야 합니다.

B. if 식을 사용하여 대체 값 확인

다음 예제와 같이 XML DML 문의 바꾸기 값에 대한 Expression2의 if 식을 지정할 수 있습니다. Expression1은 첫 번째 작업 센터의 LaborHours 특성이 업데이트될 것임을 확인합니다. Expression2는 if 식을 사용하여 LaborHours 특성의 새 값을 확인합니다.

DECLARE @myDoc XML  
SET @myDoc = '<Root>  
<Location LocationID="10"   
            LaborHours=".1"  
            MachineHours=".2" >Manu steps are described here.  
<step>Manufacturing step 1 at this work center</step>  
<step>Manufacturing step 2 at this work center</step>  
</Location>  
</Root>'  
--SELECT @myDoc  
  
SET @myDoc.modify('  
  replace value of (/Root/Location[1]/@LaborHours)[1]  
  with (  
       if (count(/Root/Location[1]/step) > 3) then  
         "3.0"  
       else  
          "1.0"  
      )  
')  
SELECT @myDoc  

C. 형식화되지 않은 XML 열에 저장된 XML 업데이트

다음 예제에서는 열에 저장된 XML을 업데이트합니다.

DROP TABLE T  
GO  
CREATE TABLE T (i INT, x XML)  
GO  
INSERT INTO T VALUES(1,'<Root>  
<ProductDescription ProductID="1" ProductName="Road Bike">  
<Features>  
  <Warranty>1 year parts and labor</Warranty>  
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>  
</Features>  
</ProductDescription>  
</Root>')  
go  
-- verify the current <ProductDescription> element  
SELECT x.query(' /Root/ProductDescription')  
FROM T  
-- update the ProductName attribute value  
UPDATE T  
SET x.modify('  
  replace value of (/Root/ProductDescription/@ProductName)[1]  
  with "New Road Bike" ')  
-- verify the update  
SELECT x.query(' /Root/ProductDescription')  
FROM T  

D. 형식화된 XML 열에 저장된 XML 업데이트

다음 예에서는 형식화된 XML 열에 저장되어 있는 제조 지침 문서의 값을 대체합니다.

이 예제에서는 먼저 AdventureWorks 데이터베이스에 형식화된 XML 열이 있는 테이블(T)을 만듭니다. 그런 다음 ProductModel 테이블의 Instructions 열에서 T 테이블로 제조 지침 XML 인스턴스를 복사합니다. 그런 다음 T 테이블의 XML에 삽입이 적용됩니다.

USE AdventureWorks2022;
GO  
DROP TABLE T  
GO  
CREATE TABLE T(
  ProductModelID INT PRIMARY KEY,   
  Instructions XML (Production.ManuInstructionsSchemaCollection))  
GO  
INSERT T   
SELECT ProductModelID, Instructions  
FROM Production.ProductModel  
WHERE ProductModelID=7  
GO
--insert a new location - <Location 1000/>.   
UPDATE T  
SET Instructions.modify('  
  declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
insert <MI:Location LocationID="1000"  LaborHours="1000"  LotSize="1000" >  
           <MI:step>Do something using <MI:tool>hammer</MI:tool></MI:step>  
         </MI:Location>  
  as first  
  into (/MI:root)[1]  
')  
GO  
SELECT Instructions  
FROM T  
GO  
-- Now replace manu. tool in location 1000  
UPDATE T  
SET Instructions.modify('  
  declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
  replace value of (/MI:root/MI:Location/MI:step/MI:tool)[1]   
  with "screwdriver"  
')  
GO  
SELECT Instructions  
FROM T  
-- Now replace value of lot size  
UPDATE T  
SET Instructions.modify('  
  declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
  replace value of (/MI:root/MI:Location/@LotSize)[1]   
  with 500 cast as xs:decimal ?  
')  
GO  
SELECT Instructions  
FROM T  

LotSize 값을 바꿀 때 캐스트사용합니다. 값이 특정 형식이어야 하는 경우 필요합니다. 이 예제에서 500이 값이면 명시적 캐스팅이 필요하지 않습니다.

참고 항목

형식화된 XML과 형식화되지 않은 XML 비교
XML 데이터의 인스턴스 만들기
xml 데이터 형식 메서드
XML DML(XML 데이터 수정 언어)