2011-08-12 15 views
2

私は実際にパフォーマンスを犠牲にし、xmlリーダーサブクエリに対してどのような選択肢があるかを知りたいという次のクエリを持っています。このクエリの目的は、いくつかのHTMLコードでデータをエクスポートすることです。テーブル値関数[XML Reader]非常に遅い - 代替?

テーブルデータの例を次に示します。

p_s_id | p_c_id | notes 
    ----------------------- 
    1 | 1 | this note is really long. 
    2 | 1 | This is fun. 
    3 | null | long note here 
    4 | 2 | this is not fun 
    5 | 2 | this is not fun 
    6 | 3 | long note here 

同じp_c_idを持つすべての別々の音符を取り出し、以下に示すように一緒に結合したいと考えています。

追加情報を提供することができますので、お気軽にコメントしてください。

select distinct 
    p_c_id 
    ,'<br/><br/>'+(select distinct '&bull; ' +cast(note as nvarchar(max)) + ' <br/> ' 
     from dbo.spec_notes_join m2 
     where m.p_c_id = m2.p_c_id 
     and isnull(note,'') <> '' 
     for xml path(''), type).value('.[1]', 'nvarchar(max)') as notes_spec 
from dbo.spec_notes_join m 

次のようにエクスポートがなります

p_c_id | notes 
-------------- 
    1 | <br/><br/> &bull; this note is really long. <br/> &bull This is fun <br/> 
    2 | <br/><br/> &bull; This is not fun. <br/> 
    3 | <br/><br/> &bull; long note here. <br/> 

答えて

3

外側のクエリでdistinctをスキップし、代わりにgroup by p_c_idを実行すると、少し上手くいくと思います。

select p_c_id, 
     '<br/><br/>'+(select distinct '&bull; ' +cast(note as nvarchar(max)) + ' <br/> ' 
        from dbo.spec_notes_join m2 
        where m.p_c_id = m2.p_c_id and 
          isnull(note,'') <> '' 
        for xml path(''), type).value('.', 'nvarchar(max)') as notes_spec 
from dbo.spec_notes_join m  
group by p_c_id 

また、CLR User-Defined Aggregate Functionを連結してみることもできます。

他の選択肢はConcatenating Row Values in Transact-SQLで見つけることができます。

+0

パフォーマンスがはるかに優れていました。 –

+0

CLRははるかに良い方法でした。申し訳ありませんが、私は前に明らかにしていません。 –

3

この代替は、XMLをスキップしながら、それがパフォーマンスを-場合は改善されるかどうかをあなたがコメントとして結果をテストして投稿できる、私は知りません、私はそれを評価するだろう。 (それはあなたがあなた自身の構造にいくつかのマイナーなデバッグを行う必要があり、私の迅速なモックアップに取り組みました。)この機能に

スタート:その後、

CREATE FUNCTION dbo.Testing 
(
    @p_c_id int 
) 
RETURNS varchar(max) 
AS 
BEGIN 
    DECLARE @ReturnString varchar(max) 

    SELECT @ReturnString = isnull(@ReturnString + ' <br/> , <br/><br/>&bull; ', '<br/><br/>&bull; ') + Name 
    from (select distinct note 
      from spec_notes_join 
      where p_c_id = @p_c_id 
      and isnull(note, '') <> '') xx 

    SET @ReturnString = @ReturnString + ' <br/> ' 

    RETURN @ReturnString 
END 
GO 

とクエリでそれを埋め込む:

SELECT p_c_id, dbo.Testing(p_c_id) 
from (select distinct p_c_id 
     from dbo.spec_notes_join) xx 

これは、各行にrequiredという関数があるため、パフォーマンスが低下することがあります。可能な場合は、関数をテーブル値関数として記述し、結合節のCROSS APPLYで参照することもできます。

+0

の方がはるかに優れていましたが、私が選んだ答えはより速くなりました。私は両方を選ぶことができたらいいなあありがとう。 –