2009-10-25 12 views
7

SQL ServerのOracle WM_CONCATと同様の機能が必要です。これは、引数として渡すフィールドのカンマ区切りリストを返します。たとえば、Oracleでは、SQL Serverの文字列へのフィールド値の連結

select WM_CONCAT(first_name) from employee where state='CA' 

は "John、Jim、Bob"を返します。

どのようにSQL Serverでこれを行うことができますか?

ありがとうございます

答えて

0

AFAIK、あなた自身で行う必要があります。

状態がCAのEmployeeのレコードをカーソルでループし、その名前の連結を返すユーザー定義関数を作成できます。

+0

を追加されていました。 – gbn

3

実際の答え:ここ

SELECT 
    SUBSTRING(buzz, 2, 2000000000) 
FROM 
    (
    SELECT 
     firstname 
    FROM 
     employee 
    WHERE 
     State = 'CA' 
    FOR XML PATH (',') 
    ) fizz(buzz) 

一般的な質問。いくつかの検索:

+3

これはSQL Server 2005以降でのみ有効です。 OPは、使用しているSQL Serverのバージョンを明記していません。 –

+1

SUBSTRINGをSTUFFコマンドで置き換えることができます.STUFFコマンドは、文字列の長さを知らなくても正しく機能します。 – WesleyJohnson

+1

@Chris J:SQL 2k5は、SQL 2000 RTMと2.5以降のバージョンの10年後の合理的な前提です。 – gbn

2

はこれを試してみてください:


    drop table #mike_temp 
go 

select * into #mike_temp 
    from (select 'Ken' as firstname, 'CO' as state 
     union all 
     select 'Mike' as firstname, 'CO' as state 
     union all 
     select 'Tom' as firstname , 'WY' as state 
     ) a 
go 

SELECT distinct 
     state 
     ,STUFF((SELECT ', ' + b.firstname FROM #mike_temp b where a.state = b.state FOR XML PATH('')),1, 2, '') AS CSVColumn 
    from #mike_temp a 
-3

この

select  
    wm_concat(name) 
from 
    employee 
where 
    state='CA' 
group by 
    state 
を試してみてください
+0

これは正しくありません。 OPが指摘したように、SQL Serverでは動作しません。別のものを意味する場合は、それを削除するか、編集することもできます。 – criticalfix

0
SELECT Field1, Substring(Field2, 2, LEN(Field2)) AS Field2 FROM 
(
    SELECT 
     [InnerData].Field1, 
     (SELECT ',' + Field2 FROM @Fields WHERE Field1=[InnerData].Field1 FOR XML PATH('')) AS Field2 
     FROM 
     (
      SELECT DISTINCT Field1 FROM @Fields 
     ) AS [InnerData] 
) AS OuterData 

私は、このリンクのSQL Server 2017 STRING_AGG機能で

Refer this Link for more Clarification

0

から、このクエリはありません、全然CURSORを使用する必要はありません

SELECT t.name as TableName 
     ,STRING_AGG(c.name, ';') AS FieldList 
    FROM sys.tables t 
    JOIN sys.columns c 
    ON t.object_id = c.object_id 
    GROUP BY t.name;