3

'For Xml Path' T-SQLを使用して、列から値のコンマ区切りリストを生成しようとしています。これはうまく機能しているようですが、問題は、カンマ区切りのリスト内のアイテムの数を取得したいということです。カンマ区切りのリストを生成するために使用しているコードの例を次に示します。

Create Table #List ([col] varchar)

Insert Into #List Select '1';
Insert Into #List Select '2';
Insert Into #List Select '3'

Select ',' + [col] From #List For Xml Path('')

これにより、期待どおりの結果が1、2、3になりますが、アイテムが3つあるというカウントを取得する方法はありません。カウントを追加しようとすると、xmlに追加されるだけです。このコードをcteと組み合わせて、カウントを取得しました。

With CTE As (
    Select 
        [col] 
    From 
        #List
)
Select
   (Select ',' + [col] From #List For Xml Path('')) As [List],
   Count(*) As [Count]
From
   CTE

CTEを使用せずにノードの数を取得するためのより簡単でクリーンな方法はありますか?内側のselectの内側と外側のfrom句を複製するだけでよいことが指摘されましたが、そのためにはfrom句の同期を維持する必要があります。リストとカウントの両方を取得したいのですが、from句を1回だけ記述します。

4

2 に答える 2

2

一時テーブルの代わりにCTEからデータを描画するのはどうですか?

With CTE As (
    Select 
        [col] 
    From 
        #List
    -- Many joins
    -- Complicated where clause
)
Select
   (Select ',' + [col] From Cte For Xml Path('')) As [List],
   Count(*) As [Count]
From
   CTE

これにより、結合と検索述語を1か所に保持できます。

于 2010-09-04T00:10:34.770 に答える
1

サブクエリアプローチを直接使用できるCTEは必要ありません

SELECT 
      COUNT(*) AS [Count], 
      (SELECT ',' + [col] FROM #List FOR XML PATH('')) AS [List]
FROM #List
于 2010-09-03T17:49:58.300 に答える