文字列値に使用する関数 - concat
適用対象:SQL Server
引数として 0 個以上の文字列を受け取り、これらの各引数の値を連結して作成された文字列を返します。
構文
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
引数
$string
連結する文字列 (省略可能)。
解説
この関数には少なくとも 2 つの引数が必要です。 空のシーケンスを引数として渡した場合、長さゼロの文字列として処理されます。
補助文字 (サロゲート ペア)
XQuery 関数でのサロゲート ペアの動作は、データベース互換性レベルと、場合によっては関数の既定の名前空間 URI によって異なります。 詳細については、SQL Server 2016 のデータベース エンジン機能の破壊的変更に関するトピックの「XQuery 関数はサロゲート対応」セクションを参照してください。 ALTER DATABASE 互換性レベル (Transact-SQL) と 照合順序と Unicode のサポートに関するページも参照してください。
例
このトピックでは、AdventureWorks サンプル データベースのさまざまな xml 型列に格納されている XML インスタンスに対する XQuery の例を示します。
A. concat() XQuery 関数を使用した文字列の連結
特定の製品モデルの場合、このクエリは保証期間と保証の説明を連結して作成された文字列を返します。 カタログ記述ドキュメントでは、 <>Warranty
要素は と <>Description
の子要素で構成<WarrantyPeriod
>されます。
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 データ型)、Instructions.query() が使用されます。 XQuery ステートメントは、クエリ メソッドの引数として指定されます。
クエリが実行されるドキュメントでは、名前空間が使用されます。 したがって、名前空間キーワードは、 名前空間 のプレフィックスを定義するために使用されます。 詳細については、「 XQuery Prolog」を参照してください。
結果を次に示します。
<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>
前のクエリは、特定の製品の情報を取得します。 次のクエリは、XML のカタログの説明が保存されているすべての製品について同じ情報を取得します。 WHERE 句の xml データ型の exist() メソッドは、行内の XML ドキュメントに 要素がある<ProductDescription
>場合に 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 に明示的にキャストする必要があります。