交流 SQL 2005溢用之 合併列值

2021-04-07 09:29:52 字數 1383 閱讀 9995

無論是在sql 2000, 還是在 sql 2005 中,都沒有提供字串的聚合函式, 所以, 當我們在處理下列要求時,會比較麻煩:

有表tb, 如下:

id    value

----- ------

1     aa

1     bb

2     aaa

2     bbb

2     ccc

需要得到結果:

id     values

------ -----------

1      aa,bb

2      aaa,bbb,ccc

即, group by id, 求 value 的和(字串相加)

這個問題的一般處理方法是, 寫乙個聚合函式:

create function dbo.f_str(@id int)

returns varchar(8000)

asbegin

declare @r varchar(8000)

set @r=''

select @r=@r+','+value from tb where id=@id

return stuff(@r,1,1,'')

endgo

-- 呼叫函式

select id, values=dbo.f_str(id) from tb group by id

這樣的問題是,函式不通用,必須為每個要處理的表編寫相應的處理函式

在sql2005中,這個問題的更好解決辦法是寫乙個clr函式,用於實現字串的聚合,這樣可以解決通用性的問題了。

而在我下面要實現的, 是只用一條sql語句來完成這個功能

(絕對是一條, 不會是用exec()取巧的那種)

-- 示例資料

declare @t table(id int, value varchar(10))

insert @t select 1, 'aa'

union all select 1, 'bb'

union all select 2, 'aaa'

union all select 2, 'bbb'

union all select 2, 'ccc'

/*--結果

id          values

----------- ----------------

1           aa,bb

2           aaa,bbb,ccc

(2 行受影響)

--*/

sql 2005新增了xml資料型別, 而且xml資料型別可以方便的與字元型別之間做轉換,上面的方法只是巧妙地利用了這一點,結合字串的一些處理函式就出來結果了

-- 下面這個示例也是合併字串的, 以系統表為列, 合併兩列

交流 SQL 2005溢用之 合併列值

問題描述 無論是在 sql 2000 還是在 sql 2005 中,都沒有提供字串的聚合函式,所以,當我們在處理下列要求時,會比較麻煩 有表tb,如下 idvalue 1aa1bb 2aaa 2bbb 2ccc 需要得到結果 idvalues 1aa,bb 2aaa,bbb,ccc 即,group ...

交流 SQL 2005溢用之 合併列值

問題描述 無論是在 sql 2000 還是在 sql 2005 中,都沒有提供字串的聚合函式,所以,當我們在處理下列要求時,會比較麻煩 有表tb,如下 idvalue 1aa1bb 2aaa 2bbb 2ccc 需要得到結果 idvalues 1aa,bb 2aaa,bbb,ccc 即,group ...

交流 SQL 2005溢用之 合併列值

問題描述 無論是在 sql 2000 還是在 sql 2005 中,都沒有提供字串的聚合函式,所以,當我們在處理下列要求時,會比較麻煩 有表 tb,如下 idvalue 1aa 1bb 2aaa 2bbb 2ccc 需要得到結果 idvalues 1aa,bb 2aaa,bbb,ccc 即,grou...