次の方法で共有


sql:column() 関数 (XQuery)

XML データ内部のリレーショナル データのバインド」で説明したように、XML データ型のメソッドを使用して XML 内部にリレーショナル値を公開する場合は、sql:column(() 関数を使用できます。

たとえば、query() メソッド (XML データ型) を使用して、xml 型の変数や列に格納されている XML インスタンスに対してクエリを指定します。場合によっては、クエリで XML 型ではない別の列の値を使用して、リレーショナル データと XML データを結合することもできます。この操作を行うには、sql:column() 関数を使用します。

SQL 値は、対応する XQuery 値にマップされ、その型は対応する SQL 型に相当する XQuery 基本データ型になります。

構文

sql:column("columnName")

解説

XQuery 内の sql:column() 関数に指定された XML 型以外の列への参照は、処理対象の行の列を参照することに注意してください。

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

  • 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 Prolog 内の 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 を構築します。この情報には、ある特定の製品モデル (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 データ型
XML インスタンスの生成
XML DML (XML データ変更言語)

その他の技術情報

xml データ型のメソッド

ヘルプおよび情報

SQL Server 2005 の参考資料の入手