OPENXML에서 value() 및 nodes() 메서드 사용

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

SELECT 절의 xml 데이터 형식에서 여러 value() 메서드를 사용하여 추출된 값의 행 집합을 생성할 수 있습니다. 이 메서드는 nodes() 추가 쿼리에 사용할 수 있는 선택한 각 노드에 대한 내부 참조를 생성합니다. 여러 열이 nodes() 있고 value() 해당 생성에 사용된 경로 식이 복잡한 경우 행 집합을 생성하는 데 이 메서드와 메서드의 조합이 더 효율적일 수 있습니다.

이 메서드는 nodes() 특수 xml 데이터 형식의 인스턴스를 생성하며, 각 인스턴스에는 컨텍스트가 다른 선택한 노드로 설정됩니다. 이러한 종류의 XML 인스턴스는 query(), value()nodes()exist() 메서드를 지원하며 집계에 count(*) 사용할 수 있습니다. 다른 모든 용도로 인해 오류가 발생합니다.

예: nodes() 사용

저자의 이름과 성을 추출하려고 하며 이름은 "David"가 아니라고 가정합니다. 또한 이 정보를 FirstName과 LastName이라는 두 개의 열이 포함된 행 집합으로 추출하려고 합니다. 사용 및 value() 메서드를 사용하면 nodes() 다음과 같이 이 작업을 수행할 수 있습니다.

SELECT nref.value('(first-name/text())[1]', 'nvarchar(50)') FirstName,
       nref.value('(last-name/text())[1]', 'nvarchar(50)') LastName
FROM   T CROSS APPLY xCol.nodes('//author') AS R(nref)
WHERE  nref.exist('first-name[. != "David"]') = 1;

이 예에서 nodes('//author') 는 각 XML 인스턴스에 대한 <author> 요소의 참조 행 집합을 생성합니다. 작성자의 이름과 성은 해당 참조를 기준으로 메서드를 평가하여 value() 가져옵니다.

SQL Server 2000은 OpenXml()을 사용하여 XML 인스턴스에서 행 집합을 생성하는 기능을 제공합니다. 행 집합에 대한 관계형 스키마를 지정하고 XML 인스턴스 내의 값이 행 집합의 열에 매핑되는 방법을 지정할 수 있습니다.

예: xml 데이터 형식에서 OPENXML() 사용

다음 예제와 같이 OpenXml()을 사용하여 이전 예제에서 쿼리를 다시 작성할 수 있습니다. 이러한 작업은 각 XML 인스턴스를 XML 변수로 읽고 OpenXML을 여기에 적용하는 커서를 만들어서 수행합니다.

DECLARE name_cursor CURSOR
FOR
   SELECT xCol
   FROM   T
OPEN name_cursor
DECLARE @xmlVal XML
DECLARE @idoc int
FETCH NEXT FROM name_cursor INTO @xmlVal;

WHILE (@@FETCH_STATUS = 0)
BEGIN
   EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlVal
   SELECT   *
   FROM   OPENXML (@idoc, '//author')
          WITH (FirstName  varchar(50) 'first-name',
                LastName   varchar(50) 'last-name') R
   WHERE  R.FirstName != 'David'

   EXEC sp_xml_removedocument @idoc
   FETCH NEXT FROM name_cursor INTO @xmlVal
END;
CLOSE name_cursor;
DEALLOCATE name_cursor;

OpenXml() 은 메모리 내 표현을 만들고 쿼리 프로세서 대신 작업 테이블을 사용합니다. XQuery 엔진 대신 MSXML 버전 3.0의 XPath 버전 1.0 프로세서를 사용합니다. 작업 테이블은 동일한 XML 인스턴스에서도 OpenXml()에 대한 여러 호출 간에 공유되지 않습니다. 이렇게 하면 확장성이 제한됩니다. OpenXml() 을 사용하면 WITH 절이 지정되지 않은 경우 XML 데이터의 에지 테이블 형식에 액세스할 수 있습니다. 또한 나머지 XML 값을 별도의 "오버플로" 열에서 사용할 수 있습니다.

nodes() 함수 조합 value() 은 XML 인덱스를 효과적으로 사용합니다. 그 결과 이러한 조합은 OpenXml보다 많은 확장성을 제공합니다.

참고 항목