一直很难理解用户自定义函数的运行机制问题?
比如很简单的字符串合并: 
 建表 
 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查询,查出来的应该是多个数据行 
 怎么调用的时候出来结果就成为一行了呢?想不明白,到底是怎么作用的?   
------解决方案--------------------select @re=@re+ ', '+cast(col2 as varchar) 
 from tb 
 where col1=@col1   
 ----------------------------------------------------- 
 这是一个变量赋值语句, 不是一个查询语句, 所以自然不输出结果. 
 而且变量赋值是from tb 的, 所以是循环检索tb的所有记录, 每检索到一条满足条件的记录处理一次变量赋值:  @re=@re+ ', '+cast(col2 as varchar)
------解决方案--------------------至于: 
 select col1,col2=dbo.f_str(col1) from tb group by col1   
 这个就没有什么特别了, 标准的 group by , 针对每个单独的 col1 调用函数
------解决方案--------------------set @re= ' ' 
 select @re=@re+ ', '+cast(col2 as varchar) 
 from tb 
 动态sql语句,把符合条件同一组col1的col2拼接起来
------解决方案--------------------给个示例: 
 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 @i   
 drop table #
------解决方案--------------------即:类似于每处理一条记录,就将值累加到变量中,尽管sql2000是基于集合的,而不是基于记录的