比如很简单的字符串合并:
建表
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查询,查出来的应该是多个数据行
怎么调用的时候出来结果就成为一行了呢?想不明白,到底是怎么作用的?
建表
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查询,查出来的应该是多个数据行
怎么调用的时候出来结果就成为一行了呢?想不明白,到底是怎么作用的?
from tb
where col1=@col1-----------------------------------------------------
这是一个变量赋值语句, 不是一个查询语句, 所以自然不输出结果.
而且变量赋值是from tb 的, 所以是循环检索tb的所有记录, 每检索到一条满足条件的记录处理一次变量赋值: @re=@re+','+cast(col2 as varchar)
col1 col2
---------- -----
a 1,2
a 1,2
b 1,2,3
b 1,2,3
b 1,2,3(所影响的行数为 5 行)
from tb这本身并不是返回数据行,而是给变量@re赋值。
select @re=@re+','+cast(col2 as varchar)
from tb把表中每行数据的col1累加连接到@re后。
select col1,col2=dbo.f_str(col1) from tb group by col1这个就没有什么特别了, 标准的 group by , 针对每个单独的 col1 调用函数
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 @idrop table #
--------------------------------------------------
qqq
888
666
ddd
bbb(所影响的行数为 5 行)
----------------------------------------------------------------------------------------------------
qqq | 888 | 666 | ddd | bbb |