[OK]を、私はおよそHow do you concat multiple rows into one column in SQL Server?コメント、より好ましい答えを提供することでジャンプする必要があるように私は感じます。
本当に残念ですが、このようなスカラー値関数を使用するとパフォーマンスが低下します。 SQLプロファイラを開いて、テーブルを呼び出すスカラー関数を使用するときに何が起きているかを見てください。
また、連結のための "変数の更新"手法は推奨されていません。将来のバージョンでは機能が継続しない可能性があるためです。
代わりにFOR XML PATHを使用するための文字列連結を行うための好ましい方法です。 XMLパスが作品のため、以下の点を考慮して方法の例については
select
stuff((select ', ' + t.tag from tags t where t.photoid = p.photoid order by tag for xml path('')),1,2,'') as taglist
,*
from photos
order by photoid;
、あなたが「ID」と呼ばれる2つのフィールドを持つテーブルと「名」
SELECT id, name
FROM table
order by name
FOR XML PATH('item'),root('itemlist')
;
を持っていることを想像することは与える:
<itemlist><item><id>2</id><name>Aardvark</a></item><item><id>1</id><name>Zebra</name></item></itemlist>
しかし、ROOTを省略すると、若干異なるものが表示されます。
SELECT id, name
FROM table
order by name
FOR XML PATH('item')
;
<item><id>2</id><name>Aardvark</a></item><item><id>1</id><name>Zebra</name></item>
そして、あなたは空のパス文字列を入れた場合、あなたは普通の文字列の連結にさえ近づく:
SELECT id, name
FROM table
order by name
FOR XML PATH('')
;
<id>2</id><name>Aardvark</a><id>1</id><name>Zebra</name>
今、あなたは@記号で始まる列に名前を付ける場合は、それがなると...本当にトリッキーなビットが来ます属性、および列名を持っていない(または、[*]それを呼び出す)であれば、それはあまりにもそのタグを残し:
SELECT ',' + name
FROM table
order by name
FOR XML PATH('')
;
,Aardvark,Zebra
さて最後に、主要なカンマを取り除くために、STUFFコマンドSTUFF(s、x、n、s2)は、位置xから始まるsのn文字を引き出します。彼らの代わりに、それはs2を置く。したがって:
SELECT STUFF( 'abcde'、2,3、 '123456');
が与える:
a123456e
をだから今、あなたのタグリストのために上記の私のクエリを見ています。
select
stuff((select ', ' + t.tag from tags t where t.photoid = p.photoid order by tag for xml path('')),1,2,'') as taglist
,*
from photos
order by photoid;
各写真について、私はタグをつかみ、それらを(順番に)コンマとスペースで連結するサブクエリを持っています。そして、そのサブクエリをstuffコマンドで囲み、コンマとスペースを削除します。
私は誤植をお詫びします。私は実際に自分のマシンにテーブルを作成してこれをテストしていません。
ロブ
は、 "インライン"、 "テーブル値"、または "スカラー値"関数ですか?それらはVSが私に与えるオプションです... – Jason
Scalar Valued - 申し訳ありませんが指定しませんでした。 – Eric
ビットを精緻化する:テーブル値関数とインライン関数の両方が型テーブルを返します。これらのオプションは、構文のいくつかを手助けすることですが、このSQLをまっすぐに実行すると、自動的にスカラーになります。 – Eric