다음을 통해 공유


sql:column() 함수(XQuery)

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 삽입 문의 원본 식 컨텍스트에 있는 xml 인스턴스만 참조할 수 있으며 그외의 경우에는 xml 형식 또는 CLR 사용자 정의 형식의 열을 참조할 수 없습니다.

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

1. 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 프롤로그에서 namespace 키워드는 쿼리 본문에 사용된 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