다음을 통해 공유


XQuery 확장 함수 - sql:column()

적용 대상:SQL Server

XML 내 관계형 데이터 바인딩 항목에 설명된 대로 XML 데이터 형식 메서드를 사용하여 XQuery 내에서 관계형 값을 노출할 때 sql:column() 함수를 사용할 수 있습니다.

예를 들어 query() 메서드(XML 데이터 형식)는 xml 형식의 변수 또는 열에 저장된 XML 인스턴스에 대한 쿼리를 지정하는 데 사용됩니다. 쿼리에 다른 비-XML 열의 값을 사용하여 관계형 및 XML 데이터를 함께 가져올 수도 있습니다. 이렇게 하려면 sql:column() 함수를 사용합니다.

SQL 값은 해당 XQuery 값에 매핑되고 해당 형식은 해당 SQL 형식과 동일한 XQuery 기본 형식이 됩니다.

구문

  
sql:column("columnName")  

설명

XQuery 내의 sql:column() 함수에 지정된 열에 대한 참조는 처리 중인 행의 열을 참조합니다.

SQL Server에서는 XML-DML insert 문의 원본 식 컨텍스트에서만 xml 인스턴스를 참조할 수 있습니다. 그렇지 않으면 xml 형식 또는 CLR 사용자 정의 형식의 열을 참조할 수 없습니다.

SQL:column() 함수는 JOIN 작업에서 지원되지 않습니다. 대신 APPLY 작업을 사용할 수 있습니다.

A. sql:column()을 사용하여 XML 내의 관계형 값 검색

XML 생성에서 다음 예제에서는 XML이 아닌 관계형 열에서 값을 검색하여 XML 및 관계형 데이터를 바인딩하는 방법을 보여 줍니다.

쿼리는 다음과 같은 형식의 XML을 생성합니다.

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

생성된 XML에서 다음을 유의하십시오.

  • ProductID, ProductNameProductPrice 특성 값은 Product 테이블에서 가져옵니다.

  • ProductModelID 특성 값은 ProductModel 테이블에서 검색됩니다.

  • 쿼리를 더 흥미롭게 만들기 위해 ProductModelName 특성 값은 xml 형식CatalogDescription 열에서 가져옵니다. 모든 제품 모델에 대해 XML 제품 모델 카탈로그 정보가 저장되지는 않으므로 if 문을 사용하여 값이 있는 경우에만 해당 값을 검색합니다.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

이전 쿼리의 다음 사항에 유의하세요.

  • 값은 서로 다른 두 테이블에서 검색되므로 FROM 절은 두 개의 테이블을 지정합니다. WHERE 절의 조건은 결과를 필터링하고 제품 모델에 카탈로그 설명이 있는 제품만 검색합니다.

  • XQuery 프롤로그네임스페이스 키워드는 쿼리 본문에 사용되는 XML 네임스페이스 접두사 "pd"를 정의합니다. 테이블 별칭 "P" 및 "PM"은 쿼리 자체의 FROM 절에 정의됩니다.

  • sql:column() 함수는 XML 내부에 비 XML 값을 가져오는 데 사용됩니다.

다음은 부분 결과입니다.

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

다음 쿼리는 제품별 정보를 포함하는 XML을 생성합니다. 이 정보에는 ProductID, ProductName, ProductPrice와 가능한 경우 특정 제품 모델 ProductModelID=19에 해당하는 모든 제품의 ProductModelName이 포함됩니다. 그런 다음 XML 형식의 변수에 XML이 @x 할당됩니다.

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x  

참고 항목

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