---测试数据---
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] int,[values] varchar(1))
insert [tb]
select 1,'x' union all
select 1,'y' union all
select 2,'a' union all
select 2,'b' union all
select 2,'c'
 
---创建字符连接函数---
create function F_Str(@col1 int)
returns nvarchar(100)
as
begin
    declare @S nvarchar(100) 
    select
      @S=isnull(@S+'','')+[values]
    from 
      tb     
    where
      Id=@col1
    return @S
end---查询---
select 
  distinct
  id,
  dbo.f_str(id) as [values]
from 
  [tb]
---结果---
id          values               
----------- -------------------
1           xy
2           abc(所影响的行数为 2 行)

解决方案 »

  1.   

    SQL code问题描述:
    无论是在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. 旧的解决方法-- 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 id=@id
        RETURN STUFF(@r, 1, 1, '')
    END
    GO
    -- 调用函数SELECt id, values=dbo.f_str(id) 
    FROM tb 
    GROUP BY id-- 2. 新的解决方法 
    -- 示例数据
    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 行受影响)
    --*/--各种字符串分函数--3.3.1 使用游标法进行字符串合并处理的示例。
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3--合并处理
    --定义结果集表变量
    DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT col1,col2 FROM tb ORDER BY  col1,col2
    DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
    OPEN tb
    FETCH tb INTO @col1,@col2
    SELECT @col1_old=@col1,@s=''
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF @col1=@col1_old
            SELECT @s=@s+','+CAST(@col2 as varchar)
        ELSE
        BEGIN
            INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
            SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
        END
        FETCH tb INTO @col1,@col2
    END
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    CLOSE tb
    DEALLOCATE tb
    --显示结果并删除测试数据
    SELECT * FROM @t
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO
      

  2.   

    如果是2005,还有这个方法。--创建测试数据
    if object_id('[LI]') is not null drop table [LI]
    go
    create table [LI]([id] int,[values] varchar(1))
    insert [LI]
    select 1,'x' union all
    select 1,'y' union all
    select 2,'a' union all
    select 2,'b' union all
    select 2,'c'
    SELECT *
    FROM(
        SELECT DISTINCT 
            id
        FROM LI
    )A
    OUTER APPLY(
        SELECT 
            [values]=  REPLACE(REPLACE(
                (
                    SELECT [values] FROM LI N
                    WHERE id = A.id
                    FOR XML AUTO
                ), '<N values="', ''), '"/>', '') 
    )N/*
    id          values
    ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           xy
    2           abc
    */
      

  3.   

     一楼的高手:
    @S=isnull(@S+'','')+[values]
    这句话是什么意思呢?
    create function F_Str(@col1 int)
    还有这句话谢谢