次の方法で共有


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 ユーザー定義型の列を参照することはできません。

join 操作では、 sql:column() 関数はサポートされていません。 代わりに 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 では、次の点に注意してください。

  • ProductIDProductName、および ProductPrice 属性値は、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  

参照

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