要求 ----------------- 原表:表1 xm zw 甲 校长 甲 主任 乙 副校长 乙 副主任 乙 办主任 ===================================== 查询结果应该是: xm zw 甲 校长,主任 乙 副校长,副主任,办主任 ===================================== 解答: 1.先建立一个合并函数 create function dbo.hb(@id varchar(100)) return varchar(8000) as begin declare @str varchar(8000) set @str='' set select @str=@str+','+zw from 表1 where xm=@id set @str=right(@str,2,len(str)-1) return(@str) end 2.调用 select xm,dbo.hb(xm) as zw from 表1 -----正式--------- --测试: create table 表A(xm varchar(10),zw varchar(10)) insert into 表A select '甲','校长' insert into 表A select '甲','主任' insert into 表A select '乙','副校长' insert into 表A select '乙','副主任' insert into 表A select '乙','办主任' insert into 表A select '丙','办主任' insert into 表A select '定','办主任'go --1.创建一个合并的函数 create function fmerg(@id varchar(10)) returns varchar(8000) as begin declare @str varchar(8000) set @str='' select @str=@str+','+zw from 表A where xm=@id set @str=right(@str,len(@str)-1) return(@str) End go--2.调用自定义函数得到结果 select distinct xm,dbo.fmerg(xm) as zw from 表A drop table 表A
“create function dbo.hb(@id varchar(100)) return varchar(8000) as begin declare @str varchar(8000) set @str='' set select @str=@str+','+zw from 表1 where xm=@id set @str=right(@str,2,len(str)-1) return(@str) end” 注意这个@str 的长度,否则当记录太多时,会自动截断后面超出长度的部分
存储过程: create proc P_test (@col sysname,@tb sysname) as begin declare @str varchar(8000), @sqlstr nvarchar(4000) set @str='' set @sqlstr='select @str=@str+'+@col+'+'','' from '+@tb+'' exec sp_executesql @sqlstr,N'@str varchar(4000) out,@col sysname,@tb sysname',@str out,@col,@tb set @str =left(@str,len(@str)-1) select @str as Return_str end create table table1 (data1 varchar(10),data2 varchar(10),data3 varchar(10))insert table1 select '张三', '98', 'class1' union all select '李四', '100', 'class2' union all select '王五', '99', 'class3'select * from table1 --结果: 张三 98 class1 李四 100 class2 王五 99 class3 create table table2 (name varchar(8000)) --======================= 调用存储过程P_test:并把结果插入到table2:insert table2 exec P_test 'data1','table1' --======================== select * from table2 --======================== 结果: 张三,李四,王五
create table A([ID] int,姓名 int,图书 varchar(20)) insert into A select 1, 1, '书'union select 2, 1, '书1' union select 3, 2, '书2' union select 4, 2, '书3'union select 5, 2, '书4' select * from A order by 姓名,图书 --创建存储过程 create proc p_t1asbegindeclare @t int,@图书 varchar(20)select 姓名,图书 as 总书目 into #t from A order by 姓名,图书 update #t set 总书目=@图书,@图书=case when 姓名=@t then @图书+','+总书目 else 总书目 end,@t=姓名 select 姓名,max(总书目) 总书目 from #t group by 姓名 end--执行exec p_t1
-----------------
原表:表1
xm zw
甲 校长
甲 主任
乙 副校长
乙 副主任
乙 办主任
=====================================
查询结果应该是:
xm zw
甲 校长,主任
乙 副校长,副主任,办主任
=====================================
解答:
1.先建立一个合并函数
create function dbo.hb(@id varchar(100))
return varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
set select @str=@str+','+zw from 表1 where xm=@id
set @str=right(@str,2,len(str)-1)
return(@str)
end
2.调用
select xm,dbo.hb(xm) as zw from 表1 -----正式---------
--测试:
create table 表A(xm varchar(10),zw varchar(10))
insert into 表A select '甲','校长'
insert into 表A select '甲','主任'
insert into 表A select '乙','副校长'
insert into 表A select '乙','副主任'
insert into 表A select '乙','办主任'
insert into 表A select '丙','办主任'
insert into 表A select '定','办主任'go
--1.创建一个合并的函数
create function fmerg(@id varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+zw from 表A where xm=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go--2.调用自定义函数得到结果
select distinct xm,dbo.fmerg(xm) as zw from 表A
drop table 表A
return varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
set select @str=@str+','+zw from 表1 where xm=@id
set @str=right(@str,2,len(str)-1)
return(@str)
end”
注意这个@str 的长度,否则当记录太多时,会自动截断后面超出长度的部分
create proc P_test (@col sysname,@tb sysname)
as
begin
declare @str varchar(8000),
@sqlstr nvarchar(4000)
set @str=''
set @sqlstr='select @str=@str+'+@col+'+'','' from '+@tb+''
exec sp_executesql @sqlstr,N'@str varchar(4000) out,@col sysname,@tb sysname',@str out,@col,@tb
set @str =left(@str,len(@str)-1)
select @str as Return_str
end
create table table1 (data1 varchar(10),data2 varchar(10),data3 varchar(10))insert table1
select '张三', '98', 'class1'
union all select '李四', '100', 'class2'
union all select '王五', '99', 'class3'select * from table1
--结果:
张三 98 class1
李四 100 class2
王五 99 class3
create table table2 (name varchar(8000))
--=======================
调用存储过程P_test:并把结果插入到table2:insert table2
exec P_test 'data1','table1'
--========================
select * from table2
--========================
结果:
张三,李四,王五
create table A([ID] int,姓名 int,图书 varchar(20))
insert into A select 1, 1, '书'union select 2, 1, '书1' union select 3, 2, '书2' union select 4, 2, '书3'union select 5, 2, '书4' select * from A order by 姓名,图书
--创建存储过程
create proc p_t1asbegindeclare @t int,@图书 varchar(20)select 姓名,图书 as 总书目 into #t from A order by 姓名,图书 update #t set 总书目=@图书,@图书=case when 姓名=@t then @图书+','+总书目 else 总书目 end,@t=姓名
select 姓名,max(总书目) 总书目 from #t group by 姓名
end--执行exec p_t1