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

적용 대상: 예SQL Server(2008부터) 예Azure SQL Database 아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

XML에 대해 XQuery를 수행하고 SQL 유형의 값을 반환합니다.Performs an XQuery against the XML and returns a value of SQL type. 이 메서드는 스칼라 값을 반환합니다.This method returns a scalar value.

이 메서드는 일반적으로 xml 유형 열, 매개 변수 또는 변수에 저장된 XML 인스턴스로부터 값을 추출하는 데 사용됩니다.You typically use this method to extract a value from an XML instance stored in an xml type column, parameter, or variable. 이 방식으로 비-XML 열에 있는 데이터와 XML 데이터를 조합 또는 비교하는 SELECT 쿼리를 지정할 수 있습니다.In this way, you can specify SELECT queries that combine or compare XML data with data in non-XML columns.

구문Syntax


value (XQuery, SQLType)  

인수Arguments

XQueryXQuery
XML 인스턴스 내에서 데이터를 검색하는 XQuery 식(문자열 리터럴)입니다.Is the XQuery expression, a string literal, that retrieves data inside the XML instance. XQuery는 최대 하나의 값을 반환해야 합니다.The XQuery must return at most one value. 그렇지 않으면 오류가 반환됩니다.Otherwise, an error is returned.

SQLTypeSQLType
반환되는 기본 SQL 유형(문자열 리터럴)입니다.Is the preferred SQL type, a string literal, to be returned. 이 메서드의 반환 형식은 SQLType 매개 변수와 일치합니다.The return type of this method matches the SQLType parameter. SQLTypexml 데이터 형식, 공용 언어 런타임 (CLR) 사용자 정의 형식, 이미지, 텍스트, ntext 또는 sql_variant 데이터 형식일 수 없습니다.SQLType cannot be an xml data type, a common language runtime (CLR) user-defined type, image, text, ntext, or sql_variant data type. SQLType은 SQL 사용자 정의 데이터 형식일 수 있습니다.SQLType can be an SQL, user-defined data type.

value() 메서드는 Transact-SQLTransact-SQL CONVERT 연산자를 암시적으로 사용하고 직렬화된 문자열 표현인 XQuery 식의 결과를 XSD 유형에서 Transact-SQLTransact-SQL 변환으로 지정된 해당 SQL 유형으로 변환하려고 시도합니다.The value() method uses the Transact-SQLTransact-SQL CONVERT operator implicitly and tries to convert the result of the XQuery expression, the serialized string representation, from XSD type to the corresponding SQL type specified by Transact-SQLTransact-SQL conversion. CONVERT에 대한 형식 캐스트 규칙에 대한 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하세요.For more information about type casting rules for CONVERT, see CAST and CONVERT (Transact-SQL).

참고

성능상의 이유로 조건자에서 value() 메서드를 사용하여 관계형 값과 비교하는 대신 sql:column() 에서 exist() 를 사용하세요.For performance reasons, instead of using the value() method in a predicate to compare with a relational value, use exist() with sql:column(). 뒤에 나오는 예 4에서 이러한 작업 방법을 보여 줍니다.This is shown in example D that follows.

Examples

1.A. xml 유형 변수에 대해 value() 메서드 사용Using the value() method against an xml type variable

다음 예에서 XML 인스턴스는 xml 유형의 변수에 저장됩니다.In the following example, an XML instance is stored in a variable of xml type. value() 메서드는 XML에서 ProductID 특성 값을 검색합니다.The value() method retrieves the ProductID attribute value from the XML. 그런 다음 이 값은 int 변수에 할당됩니다.The value is then assigned to an int variable.

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이 결과로 반환됩니다.Value 1 is returned as a result.

XML 인스턴스에 ProductID 특성이 하나만 있지만 정적 형식 지정 규칙에 따라 경로 식이 단일 항목을 반환하도록 명시적으로 지정해야 합니다.Although there is only one ProductID attribute in the XML instance, the static typing rules require you to explicitly specify that the path expression returns a singleton. 따라서 추가 항목 [1]은 경로 식의 끝에 지정됩니다.Therefore, the additional [1] is specified at the end of the path expression. 정적 형식 지정에 대한 자세한 내용은 XQuery 및 정적 형식 지정을 참조하세요.For more information about static typing, see XQuery and Static Typing.

2.B. value() 메서드를 사용하여 xml 유형 열에서 값 검색Using the value() method to retrieve a value from an xml type column

AdventureWorks 데이터베이스의 xml 유형 열(CatalogDescription)에 대해서는 다음 쿼리가 지정됩니다.The following query is specified against an xml type column (CatalogDescription) in the AdventureWorks database. 이 쿼리는 열에 저장된 각 XML 인스턴스로부터 ProductModelID 특성 값을 검색합니다.The query retrieves ProductModelID attribute values from each XML instance stored in the column.

SELECT CatalogDescription.value('             
    declare namespace PD="http://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             

이전 쿼리에서 다음을 유의하세요.Note the following from the previous query:

  • namespace 키워드는 네임스페이스 접두사를 정의하는 데 사용됩니다.The namespace keyword is used to define a namespace prefix.

  • 각 정적 형식 지정 요구 사항에 따라 [1] 메서드에 있는 경로 식의 끝에 value()이 추가되어 해당 경로 식이 단일 항목을 반환함을 명시적으로 나타냅니다.Per static typing requirements, [1] is added at the end of the path expression in the value() method to explicitly indicate that the path expression returns a singleton.

    다음은 결과의 일부입니다.This is the partial result:

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

3.C. value() 및 exist() 메서드를 사용하여 xml 유형 열로부터 값 검색Using the value() and exist() methods to retrieve values from an xml type column

다음 예에서는 xml 데이터 형식의 value() 메서드 및 exist() 메서드를 사용하는 방법을 보여 줍니다.The following example shows using both the value() method and the exist() method of the xml data type. value() 메서드는 XML로부터 ProductModelID 특성 값을 검색하는 데 사용됩니다.The value() method is used to retrieve ProductModelID attribute values from the XML. exist() 절에 있는 WHERE 메서드는 테이블의 행을 필터링하는 데 사용됩니다.The exist() method in the WHERE clause is used to filter the rows from the table.

이 쿼리는 여러 기능 중 하나로 보증 정보(<Warranty> 요소)가 포함된 제품 모델 ID를 XML 인스턴스로부터 검색합니다.The query retrieves product model IDs from XML instances that include warranty information (the <Warranty> element) as one of the features. WHERE 절의 조건에서는 exist() 메서드를 사용하여 이 조건을 만족하는 행만 검색합니다.The condition in the WHERE clause uses the exist() method to retrieve only the rows satisfying this condition.

SELECT CatalogDescription.value('  
     declare namespace PD="http://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="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  

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

이전 쿼리에서 다음을 유의하세요.Note the following from the previous query:

  • CatalogDescription 열은 형식화된 XML 열입니다.The CatalogDescription column is a typed XML column. 즉, 이 열에는 이와 관련된 스키마 컬렉션이 있습니다.This means that it has a schema collection associated with it. XQuery 프롤로그에서 네임스페이스 선언은 나중에 쿼리 본문에서 사용되는 접두사를 정의하기 위해 사용됩니다.In the XQuery Prolog, the namespace declaration is used to define the prefix that is used later in the query body.

  • exist() 메서드가 1(True)을 반환하는 경우는 XML 인스턴스에 여러 기능 중 하나로 <Warranty> 자식 요소가 포함되어 있음을 나타냅니다.If the exist() method returns a 1 (True), it indicates that the XML instance includes the <Warranty> child element as one of the features.

  • 그런 다음 value() 절의 SELECT 메서드는 ProductModelID 특성 값을 정수로 검색합니다.The value() method in the SELECT clause then retrieves the ProductModelID attribute values as integers.

    다음은 결과의 일부입니다.This is the partial result:

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

4.D. value() 메서드 대신 exist() 메서드 사용Using the exist() method instead of the value() method

성능상의 이유로 조건자에서 value() 메서드를 사용하여 관계형 값과 비교하는 대신 exist()에서 sql:column()를 사용하세요.For performance reasons, instead of using the value() method in a predicate to compare with a relational value, use exist() with sql:column(). 예를 들어 다음과 같이 사용할 수 있습니다.For example:

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  

다음은 이에 대한 예입니다.This can be written in the following way:

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

참고 항목See Also

WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가 Add Namespaces to Queries with WITH XMLNAMESPACES
형식화된 XML과 형식화되지 않은 XML 비교 Compare Typed XML to Untyped XML
XML 데이터 인스턴스 만들기 Create Instances of XML Data
xml 데이터 형식 메서드 xml Data Type Methods
XML DML(XML 데이터 수정 언어)XML Data Modification Language (XML DML)