日期:2014-05-18  浏览次数:20495 次

请教存储过程,能实现给高分
表一(users):

id       name     kcid(课程ID)
1         aa           1
2         aa           2
3         bb           1
4         aa           3


表2(kc):

kcid           kc
1               语文
2               数学
3               英语


表单提交name

比如说检索“aa”的选课情况,先从USERS表里查询到AA的都有哪些kcid,然后再从表KC里面查询都是哪些课



aa     1             语文
aa     2             数学
aa     3             英语

这个用sql   server存储过程来写怎么写?

------解决方案--------------------
--一条一条输出

create proc up_test(@name varchar(20))
as
declare @name varchar(10),@kcid int,@kc varchar(10)
declare cur_tmp cursor for
select name,users.kcid,kc
from users
left join kc on users.kcid=kc.kcid
where name=@name
open cur_tmp
fetch next from cur_tmp into @name,@kcid,@kc
while @@fetch_status=0
begin
select @name,@kcid,@kc
fetch next from cur_tmp into @name,@kcid,@kc
end
close cur_tmp
deallocate cur_tmp
------解决方案--------------------
楼主要对users表的数据逐行执行,那么输出table又有什么意义?用在何处?

------解决方案--------------------
--测试环境
create table users(id int identity primary key,[name] nvarchar(100),kcID int)
insert into users
select 'aa ',1 union all
select 'aa ',2 union all
select 'bb ',1 union all
select 'aa ',3 union all
select 'bb ',3
go
create table kc(kcID int primary key,kc nvarchar(100))
insert into kc
select 1, '语文 ' union all
select 2, '数学 ' union all
select 3, '英语 '
go
--建立函数
create function f_kc(@name nvarchar(100))
returns nvarchar(100)
as
begin
declare @s nvarchar(100)
set @s = ' '
select @s = @s + ', ' + kc.kc from users left join kc on users.kcID = kc.kcID
where users.[name]= @name
return substring(@s,2,len(@s))
end;
--查询
select 姓名 = [name],课程 = dbo.f_kc(name)
from users group by [name]
--输出
/*
姓名 课程
aa 语文,数学,英语
bb 语文,英语
*/


------解决方案--------------------
create proc up_test(@name varchar(20))
as
select name,users.kcid,kc,sex,gy
from users
left join kc on users.kcid=kc.kcid
where name=@name
GO

declare @name varchar(10)
set @name = 'aa '
INSERT INTO tbTest(name,kcid,kc,sex,gy)
EXEC spTest @name
------解决方案--------------------
请楼主在前面回复的存储过程的第一行加上SET NOCOUNT ON,以禁止回显,象下面这样:

if object_id( 'tbUsers ') is not null
drop table tbUsers
if object_id( 'tbKc ') is not null
drop table tbKc
if object_id( 'tbTest ') is not null
drop table tbTest
if object_id( 'spTest ') is not null
drop proc spTest
GO
----创建将存储过程结果要插入的表
create table tbTest(name varchar(10),kcid int,kc varchar(10),