2016-09-01 13 views
2

2部質問列データをストアドプロシージャからカンマ区切りの文字列として送信するにはどうすればよいですか?

私はできる限りこのことを説明しようとします。

PART 1

私はこのようになりますテーブルを持っている:

enter image description here

2つの最後の行がタイプとURLIDで同一exeptです。

私は、私はそれがデータの上に私を取得するには、次のクエリを実行呼び出すSP持た:

データがどのように見えるように、私が作ることができますどのように
SELECT Urlid, DomainName, OrgId, DomainId, s.TypeId AS TypeId 
FROM DomainData d 
JOIN SystemUrls s ON s.DomainId = d.Id 
WHERE @OrgId IS NULL OR OrgId = @OrgId 

を?:私は上記の結果を変更し、LINQクエリを使用してサーバー上でそれを変更する(C#)を決めていけないと仮定すると

Name(varchar) OrgId(bigint)  DomainId(bigint) TypeId(int) 
Three   556548-4499    71    2,1 

PART 2

どうでしょう私に邪悪な結果を与えるようなlinqクエリの外観ですか?

+1

何か試しましたか? mysqlではgroup_concat - >と呼ばれ、SQL Serverでそれを行う方法を尋ねる質問があります。 linqのために試してみましたか? –

+1

XMLを見てください:http://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server – applejacks01

+0

@Gilad Green私はいくつかのgroupby節を試しました。私はgroup_concatを使わなかったし、あなたのコメントを読むまでそれについても気づいていなかった。私の知識は上記の進歩を呼び出すことができますtsqlは限られています。編集:私は自分でそれを解決しようとせずに単に答えを探して質問を投稿しません。 – ThunD3eR

答えて

1

パート1については、this questionをご覧ください。誰かが私の前に答えたので、私は繰り返しません:)

パート2の場合 - 最初にジョイントデータを選択し、それをメモリに入れた後に(ToList()string.Joinを連結することができますすべてTypeId

var jointData = (from d in db.DomainData 
       join s in db.SystemUrls on d.Id equals s.DomainId into sg 
       new { m.DomainName, m.OrgId, DomainId = m.Id, s.TypeId }).ToList(); 

var result = jointData.GroupBy(item => new { item.DomainName, item.OrgId, item.DomainId }) 
      .Select(g => new { 
       g.Key.DomainName, 
       g.Key.OrgId, 
       g.Key.DomainId, 
       TypeId = string.Join(", ", g.Select(item => item.TypeId)) 
      }); 
+0

これをワンショットで実行しようとするとどうなりますか? ToListへの呼び出しの前にGroupBy/Selectを実行します。私が唯一の理由は、string.JoinがSQLへの変換を持たず、例外をスローするためです。なぜなら、これは2つの部分に分割されているからです。 – applejacks01

+0

これは魅力的でした。私はtsql soloutionのXML STUFFを試していますが、これは素晴らしいことです。ありがとうございました! – ThunD3eR

+0

@ applejacks01 - 私は現在、それをテストするデータベースを持っていないが、私が知っているからデータベースを持っていないので、一度にテストしなかった。それはstring.joinの実行方法が分からないと失敗する。 –

-2

最初の一時テーブルを作成し、 と予想される範囲と宣言あなたが長い文字列形式のデータ型とサイズでそれをすべてをしたいようにしてください影響が出ることがあります。その後、

、この質問は以前に回答されている方法によって

insert into #temp(
    Urlid, DomainName, OrgId, DomainId, s.TypeId) 
    SELECT Urlid, DomainName, OrgId, DomainId, s.TypeId 
    FROM DomainData d 
    JOIN SystemUrls s ON s.DomainId = d.Id 
    WHERE @OrgId IS NULL OR OrgId = @OrgId 

declare @Column1 varchar(350), 
select @Column1= coalesce(@Column1+',','')+convert(varchar(30),TypeId) 
from #temp 

update #temp 
set [email protected] 
from #temp 

select * from #temp 

が、これはリンクで重複したエントリを作成しないようにしよう:これはあなたのために働く場合click here

+0

これは、すべてのtypeIdsを同じカンマ区切り値に設定します。どちらが間違っている – ThunD3eR

1

参照:
注:I Urlid、DomainName、OrgIdを考えると、DomainIdは "DomainData"に属し、IdはTypeIdが "SystemUrls"テーブルに属しています。

SELECT DomainName, OrgId, Id, 
    STUFF((SELECT ', ' + cast(s2.TypeId as varchar(5)) 
        FROM SystemUrls AS s2 
        WHERE s2.DomainId = d.Id 
        FOR XML PATH('') 
       ), 1, 2, '') as TypeId 

    FROM DomainData d 
    WHERE @OrgId IS NULL OR OrgId = @OrgId 
    GROUP BY DomainName, OrgId, Id 
+0

私は私の最初の試みにかなり近づいていた。私はちょうど私が私に合併症を与えていた参加を取り除くために突っ込みました。これはありがとうございました:) 編集:あなたの前提の小さな部分が間違っているので、部分を変更してください。 – ThunD3eR

関連する問題