很多人可能發現,無論是在sql 2000, 還是在 sql 2005 中,都沒有提供字符串的聚合函數, 所以, 當我們在處理下列要求時,會比較麻煩, 但在 sql server 2005中, 這種情況得到了改善, 我們可以輕松地完成這項處理。
問題描述:
無論是在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 的和(字符串相加)1. 舊的解決方法
創建處理函數
create function dbo.f_str(@id int)
returns varchar(8000)
as
begin
  declare @r varchar(8000)
  set @r = ''
  select @r = @r + ',' + value
  from tb
  where [email protected]
  return stuff(@r, 1, 1, '')
end
go
-- 調用函數
select id, values=dbo.f_str(id)
from tb
group by id2. 新的解決方法
示例數據
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'
-- 查詢處理
select *
from(
  select distinct
    id
  from @t
)a
outer apply(
  select
    [values]= stuff(replace(replace(
      (
        select value from @t n
        where id = a.id
        for xml auto
      ), '<n value="', ','), '"/>', ''), 1, 1, '')
)n/*--結果
id     values
----------- ----------------
1      aa,bb
2      aaa,bbb,ccc
(2 行受影響)
--*/注: 合并與分拆的clr, sql2005的示例中有:
在安裝sql 2005的示例后,默認安裝目錄為 drive:program filesmicrosoft sql server90samplesengineprogrammabilityclrstringutilities中。
新聞熱點
疑難解答