次の方法で共有


文字列値に使用する関数 - 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)のCollation と 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 データ型) Instructions.query() が使用されます。 XQuery ステートメントは、クエリ メソッドの引数として指定されます。

  • クエリが実行されるドキュメントでは、名前空間が使用されます。 したがって、 namespace キーワードを使用して、名前空間のプレフィックスを定義します。 詳細については、「 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 に明示的にキャストする必要があります。

参照

xml データ型に対する XQuery 関数