value() 메서드(xml 데이터 형식)

XML에 대해 XQuery를 수행하고 SQL 유형의 값을 반환합니다. 이 메서드는 스칼라 값을 반환합니다.

이 메서드는 일반적으로 xml 유형 열, 매개 변수 또는 변수에 저장된 XML 인스턴스로부터 값을 추출하는 데 사용됩니다. 이 방식으로 비-XML 열에 있는 데이터와 XML 데이터를 조합 또는 비교하는 SELECT 쿼리를 지정할 수 있습니다.

구문

value (XQuery, SQLType)

인수

  • XQuery
    XML 인스턴스 내에서 데이터를 검색하는 XQuery 식(문자열 리터럴)입니다. XQuery는 최대 하나의 값을 반환해야 합니다. 그렇지 않으면 오류가 반환됩니다.

  • SQLType
    반환되는 기본 SQL 유형(문자열 리터럴)입니다. 이 메서드의 반환 형식은 SQLType 매개 변수와 일치합니다. SQLType은 xml 데이터 형식, CLR(공용 언어 런타임) 사용자 정의 형식, image, text, ntext 또는 sql_variant 데이터 형식이 될 수 없습니다. SQLType은 SQL 사용자 정의 데이터 형식일 수 있습니다.

value() 메서드는 Transact-SQL CONVERT 연산자를 암시적으로 사용하고 직렬화된 문자열 표현인 XQuery 식의 결과를 XSD 유형에서 Transact-SQL 변환으로 지정된 해당 SQL 유형으로 변환하려고 시도합니다. CONVERT에 대한 캐스트 규칙에 대한 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하십시오.

[!참고]

성능상의 이유로 조건자에서 value() 메서드를 사용하여 관계형 값과 비교하는 대신 sql:column()에서 exist()를 사용하십시오. 뒤에 나오는 예 4에서 이러한 작업 방법을 보여 줍니다.

1. xml 유형 변수에 대해 value() 메서드 사용

다음 예에서 XML 인스턴스는 xml 유형의 변수에 저장됩니다. value() 메서드는 XML에서 ProductID 특성 값을 검색합니다. 그런 다음 이 값은 int 변수에 할당됩니다.

DECLARE @myDoc xml
DECLARE @ProdID int
SET @myDoc = '<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>'

SET @ProdID =  @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int' )
SELECT @ProdID

값 1이 결과로 반환됩니다.

XML 인스턴스에 ProductID 특성이 하나만 있지만 정적 형식 지정 규칙에 따라 경로 식이 단일 항목을 반환하도록 명시적으로 지정해야 합니다. 따라서 추가 항목 [1]은 경로 식의 끝에 지정됩니다. 정적 형식 지정에 대한 자세한 내용은 XQuery 및 정적 형식 지정을 참조하십시오.

2. value() 메서드를 사용하여 xml 유형 열에서 값 검색

AdventureWorks 데이터베이스의 xml 유형 열(CatalogDescription)에 대해서는 다음 쿼리가 지정됩니다. 이 쿼리는 열에 저장된 각 XML 인스턴스로부터 ProductModelID 특성 값을 검색합니다.

SELECT CatalogDescription.value('           
    declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";           
       (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result           
FROM Production.ProductModel           
WHERE CatalogDescription IS NOT NULL           
ORDER BY Result desc           

이전 쿼리에서 다음을 유의하십시오.

  • namespace 키워드는 네임스페이스 접두사를 정의하는 데 사용됩니다.

  • 각 정적 형식 지정 요구 사항에 따라 value() 메서드에 있는 경로 식의 끝에 [1]이 추가되어 해당 경로 식이 단일 항목을 반환함을 명시적으로 나타냅니다.

다음은 결과의 일부입니다.

-----------
35         
34         
...

3. value() 및 exist() 메서드를 사용하여 xml 유형 열로부터 값 검색

다음 예에서는 xml 데이터 형식의 value() 메서드 및 exist() 메서드를 사용하는 방법을 보여 줍니다. value() 메서드는 XML로부터 ProductModelID 특성 값을 검색하는 데 사용됩니다. WHERE 절에 있는 exist() 메서드는 테이블의 행을 필터링하는 데 사용됩니다.

이 쿼리는 여러 기능 중 하나로 보증 정보(<Warranty> 요소)가 포함된 제품 모델 ID를 XML 인스턴스로부터 검색합니다. WHERE 절의 조건에서는 exist() 메서드를 사용하여 이 조건을 만족하는 행만 검색합니다.

SELECT CatalogDescription.value('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           (/PD:ProductDescription/@ProductModelID)[1] ', 'int') as Result
FROM  Production.ProductModel
WHERE CatalogDescription.exist('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

이전 쿼리에서 다음을 유의하십시오.

  • CatalogDescription 열은 형식화된 XML 열입니다. 즉, 이 열에는 이와 관련된 스키마 컬렉션이 있습니다. XQuery 프롤로그에서 네임스페이스 선언은 나중에 쿼리 본문에서 사용되는 접두사를 정의하기 위해 사용됩니다.

  • exist() 메서드가 1(True)을 반환하는 경우는 XML 인스턴스에 여러 기능 중 하나로 <Warranty> 자식 요소가 포함되어 있음을 나타냅니다.

  • 그런 다음 SELECT 절의 value() 메서드는 ProductModelID 특성 값을 정수로 검색합니다.

다음은 결과의 일부입니다.

Result     
-----------
19         
23         
...

4. value() 메서드 대신 exist() 메서드 사용

성능상의 이유로 조건자에서 value() 메서드를 사용하여 관계형 값과 비교하는 대신 sql:column()에서 exist()를 사용하십시오. 예를 들면 다음과 같습니다.

CREATE TABLE T (c1 int, c2 varchar(10), c3 xml)
GO

SELECT c1, c2, c3 
FROM T
WHERE c3.value( '/root[1]/@a', 'integer') = c1
GO

다음은 이에 대한 예입니다.

SELECT c1, c2, c3 
FROM T
WHERE c3.exist( '/root[@a=sql:column("c1")]') = 1
GO