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