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 では、次の点に注意してください。

  • ProductIDProductNameProductPrice の各属性値は、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  
    

上のクエリに関して、次の点に注意してください。

  • 値を 2 つの異なるテーブルから取得するため、FROM 句で 2 つのテーブルを指定しています。 WHERE 句に定義された条件により結果をフィルター選択し、カタログの説明のある製品モデルの製品のみを取得しています。

  • XQuery Prolognamespace キーワードは、クエリ本文で使用される 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 を構築します。 この情報には、ある特定の製品モデル (ProductModelID=19) に属するすべての製品について、ProductID、ProductName、ProductPrice、および取得可能な場合は 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  

参照

XQuery 拡張関数のSQL Server
型指定された XML と型指定されていない XML の比較
XML データ (SQL Server)
XML データのインスタンスの作成
xml データ型メソッド
XML データ変更言語 (XML DML)