比如很简单的字符串合并:
建表
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'
自定义函数
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
调用
select col1,col2=dbo.f_str(col1) from tb group by col1我不理解的是自定义函数中的关键语句
select @re=@re+','+cast(col2 as varchar)
from tb
where col1=@col1
很类似sql查询,查出来的应该是多个数据行
怎么调用的时候出来结果就成为一行了呢?想不明白,到底是怎么作用的?

解决方案 »

  1.   

    因为select col1,col2=dbo.f_str(col1) from tb group by col1用了group by col1分组了,你去掉group by col1就是多行了
      

  2.   

    select @re=@re+','+cast(col2 as varchar)
    from tb
    where col1=@col1-----------------------------------------------------
    这是一个变量赋值语句, 不是一个查询语句, 所以自然不输出结果.
    而且变量赋值是from tb 的, 所以是循环检索tb的所有记录, 每检索到一条满足条件的记录处理一次变量赋值:  @re=@re+','+cast(col2 as varchar)
      

  3.   

    不用group by
    col1       col2 
    ---------- -----
    a          1,2
    a          1,2
    b          1,2,3
    b          1,2,3
    b          1,2,3(所影响的行数为 5 行)
      

  4.   

    select @re=cast(col2 as varchar)
    from tb这本身并不是返回数据行,而是给变量@re赋值。
    select @re=@re+','+cast(col2 as varchar)
    from tb把表中每行数据的col1累加连接到@re后。
      

  5.   

    至于:
    select col1,col2=dbo.f_str(col1) from tb group by col1这个就没有什么特别了, 标准的 group by , 针对每个单独的 col1 调用函数
      

  6.   

    set @re=''
    select @re=@re+','+cast(col2 as varchar)
    from tb
    动态sql语句,把符合条件同一组col1的col2拼接起来
      

  7.   

    给个示例:
    create table #
    (
    a varchar(50)
    )insert into #
    select 'qqq' union all
    select '888' union all
    select '666' union all
    select 'ddd' union all
    select 'bbb'select * from #
    declare @i varchar(100)
    set @i=''
    select @i=@i+a+' | '
    from #
    select @idrop table #
      

  8.   

    result:(所影响的行数为 5 行)a                                                  
    -------------------------------------------------- 
    qqq
    888
    666
    ddd
    bbb(所影响的行数为 5 行)                                                                                                     
    ---------------------------------------------------------------------------------------------------- 
    qqq | 888 | 666 | ddd | bbb |
      

  9.   

    即:类似于每处理一条记录,就将值累加到变量中,尽管sql2000是基于集合的,而不是基于记录的