concat 関数 (XQuery)
0 個以上の文字列を引数として受け取り、それらの値を結合した文字列を返します。
構文
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
引数
- $string
連結する文字列 (省略可能)。
説明
この関数には少なくとも 2 つの引数が必要です。 空のシーケンスを引数として渡した場合、長さゼロの文字列として処理されます。
補助文字 (サロゲート ペア)
XQuery 関数におけるサロゲート ペアの動作は、データベースの互換性レベルに左右されます。場合によっては、関数の既定の名前空間 URI に左右されることもあります。 詳細については、「SQL Server 2012 におけるデータベース エンジン機能の重大な変更」の「サロゲート対応の XQuery 関数」を参照してください。 「ALTER DATABASE 互換性レベル (Transact-SQL)」および「照合順序と Unicode のサポート」も参照してください。
使用例
このトピックでは、AdventureWorks サンプル データベースのさまざまな xml 型の列に格納されている XML インスタンスに対して実行する XQuery の例を紹介します。
A. concat() XQuery 関数を使用した文字列の連結
特定の製品モデルについて、保証期間と保証内容を連結した文字列を返します。 カタログの説明ドキュメントでは、<Warranty> 要素が <WarrantyPeriod> 子要素と <Description> 子要素から構成されています。
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductModelName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE PD.ProductModelID=28
上のクエリに関して、次の点に注意してください。
SELECT 句の CatalogDescription は xml 型の列です。 このため、query() メソッド (XML データ型) として CatalogDescription.query() を使用しています。 query メソッドの引数には XQuery ステートメントを指定しています。
クエリを実行する対象のドキュメントには名前空間を使用します。 このため、XMLNAMESPACES キーワードを使用して、名前空間プレフィックスを定義しています。 詳細については、「XQuery プロローグ」を参照してください。
結果を次に示します。
<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>
上のクエリでは、特定の製品の情報を取得しました。 次のクエリは、XML のカタログの説明が保存されているすべての製品について同じ情報を取得します。 行の XML ドキュメントに <ProductDescription> 要素が存在する場合、WHERE 句で指定した xml データ型の exist() メソッドは True を返します。
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE CatalogDescription.exist('//pd:ProductDescription ') = 1
この xml 型の exist() メソッドが返すブール値は 1 と比較されます。
実装の制限事項
次に、制限事項を示します。
- SQL Server の concat() 関数は xs:string 型の値のみを受け取ります。 それ以外の値は、明示的に xs:string または xdt:untypedAtomic にキャストする必要があります。