日期:2014-05-19  浏览次数:20598 次

一直很难理解用户自定义函数的运行机制问题?
比如很简单的字符串合并:
建表
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是基于集合的,而不是基于记录的