各种字符串合并处理示例\
--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
/*==============================================*/
--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
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
GO--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
    DECLARE @re varchar(100)
    SET @re=''
    SELECT @re=@re+','+CAST(col2 as varchar)
    FROM tb
    WHERE col1=@col1
    RETURN(STUFF(@re,1,1,''))
END
GO--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
GO/*==============================================*/
--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
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--合并处理
SELECT col1,col2=CAST(col2 as varchar(100)) 
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET 
    @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
    @col1=col1,
    col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1       col2
---------- -------------
a          1
a          1,2
b          1
b          1,2
b          1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1       col2
---------- -----------
a          1,2
b          1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO
/*==============================================*/

解决方案 »

  1.   

    DECLARE @T2 TABLE(x nvarchar(10),y nvarchar(10))
    insert @T2
    SELECT 'w',null UNION ALL
    SELECT 'g',null UNION ALL 
    SELECT 'a',nulldeclare @str nvarchar(40)
    select @str=isnull(@str,'')+x+','
    from @T2update @T2
    set y=left(@str,len(@str)-1)select * from @T2x          y
    ---------- ----------
    w          w,g,a
    g          w,g,a
    a          w,g,a(3 行受影响)
      

  2.   


    insert into 表 (字段)
    select 字段 from 表 a where not exists (select 1 from 表 where a.主键=主键 and 字段<a.字段)
      

  3.   

    看这条语句应改可以 select 值= stuff(select (','+ 字段) from 表 where a.字段=字段 for xml path(''),1,1,'')   from 表 a 
      

  4.   


    select 值= stuff((select ','+ 字段 from 表 where a.字段=字段 for xml path('')),1,1,'')   from 表 a 
      

  5.   

    例子:
    id          value            
    ----------- ----------  
    1           cool
    1           nice
    1           wow
    2           cool
    2           wow
    3           cool
    3           nice
    4           nice 合并字符串之后:
    id          value
    ----------- -------------
    1           coolnicewow
    2           coolwow
    3           coolnice
    4           nice--------------------------------------自定义函数
    create   function   getstr(@id int)   
      returns   varchar(2000)   
      as     
      begin   
      declare   @str   varchar(2000)   
      set   @str=''   
      select   @str=@str+rtrim(value) from getstr where id=@id   
         
      return   @str   
      end 
      --------------------------------------------------一条语句实现
      select id,dbo.string(id) from getstr group by id
      

  6.   


    --------------------------------------------------一条语句实现
      select id,dbo.string(id) from getstr group by id
    写错了 dbo.string(id) 换成 dbo.Getstr(id) 
      

  7.   

    --測試數據
    declare @table table
    (
    id int
    ,value varchar(10)
    );
    insert into @table
    values
    (1,'cool')
    ,(1,'nice')
    ,(1,'wow')
    ,(2,'cool')
    ,(2,'wow')
    ,(3,'cool')
    ,(3,'nice')
    ,(4,'nice');
    --查詢
    select id,
    (select value as [text()]
    from @table
    where id=t1.id
    for xml path('')
            )
    from @table t1
    group by id