请教存储过程,能实现给高分
表一(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),
sex varchar(4),gy varchar(10)) /*新增此二列*/
----创建测试数据
create table tbUsers(id int,name varchar(10),kcid int,
sex varchar(4)) /*users表新增sex列*/
insert tbUsers
select 1, 'aa ', 1, '男 ' union all
select 2, 'aa ', 2, '男 ' union all
select 3, 'bb ', 1, '女 ' union all
select 4, 'aa ', 3, '男 '
create table tbKc(kcid int,kc varchar(10))
insert tbKc
select 1, '语文 ' union all
select 2, '数学 ' union all
select 3, '英语 '
GO
----创建用游标插入记录的存储过程
CREATE PROC spTest @name varchar(10),@gy varchar(10)/*gy对应的参数*/
AS
SET NOCOUNT ON /*关闭回显*/
--定义变量,将游标中的每行读出到变量中用于处理或插入到表中
DECLARE @name2 varchar(10),@kcid int,@kc varchar(10),@sex varchar(4)
--定义游标
DECLARE cur CURSOR STATIC FOR
SELECT a.name,a.kcid,b.kc,a.sex
FROM tbUsers as a
LEFT JOIN tbKc as b on a.kcid = b.kcid
WHERE a.name = @name /*只查询参数@name指定的行*/
ORDER BY a.name,b.kcid
--打开游标
OPEN cur
--将游标定位到第一行
FETCH NEXT FROM cur INTO @name2,@kcid,@kc,@sex
WHILE @@FETCH_STATUS = 0 /*如果游标定位成功则进入循环体进行插入*/
BEGIN
--将读出的变量插入到tbTest表中.(可以在循环体中对读出的变量做任何处理)
insert into tbTest(name,kcid,kc,sex,gy) values(@name2,@kcid,@kc,@sex,@gy)
--当前行处理结束后游标向下移动一行
FETCH NEXT FROM cur INTO @name2,@kcid,@kc,@sex
END
--游标遍历结束后关闭游标
CLOSE cur
--释放游标所占用的资源
DEALLOCATE cur
GO
----执行存储过程,存储过程中使用游标将记录插入到tbTest表中
declare @name varchar(10),@gy varchar(10)
set @name = 'aa '
set @gy = 'good '
EXEC spTest @name,@gy
----查看
select * from tbTest
----清除测试环境
drop table tbUsers,tbKc,tbTest
drop proc spTest
/*结果
name kcid kc sex gy
---------- ----------- ------------------------
aa 1 语文 男 good
aa 2 数学 男 good
aa 3 英语 男 good
*/
[解决办法]
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),
sex varchar(4),gy varchar(10),nr varchar(100)) /*新增nr列*/
----创建测试数据
create table tbUsers(id int,name varchar(10),kcid int,
sex varchar(4)) /*users表新增sex列*/
insert tbUsers
select 1, 'aa ', 1, '男 ' union all
select 2, 'aa ', 2, '男 ' union all
select 3, 'bb ', 1, '女 ' union all
select 4, 'aa ', 3, '男 '
create table tbKc(kcid int,kc varchar(10))
insert tbKc
select 1, '语文 ' union all
select 2, '数学 ' union all
select 3, '英语 '
GO
----创建存储过程
CREATE PROC spTest @name varchar(10),@gy varchar(10)/*gy对应的参数*/
AS
SELECT a.name,a.kcid,b.kc,a.sex,@gy,
--增加此列(中间用逗号隔开了):nr=name +kcid +kc +sex+gy
nr = a.name + ', ' + rtrim(a.kcid) + ', ' + b.kc + ', ' + a.sex + ', ' + @gy
FROM tbUsers as a
LEFT JOIN tbKc as b on a.kcid = b.kcid
WHERE a.name = @name /*只查询参数@name指定的行*/
ORDER BY a.name,b.kcid
GO
----执行存储过程,将存储过程返回的结果插入到tbTest表中
declare @name varchar(10),@gy varchar(10)
set @name = 'aa '
set @gy = 'good '
INSERT INTO tbTest EXEC spTest @name,@gy
----查看
select * from tbTest
----清除测试环境
drop table tbUsers,tbKc,tbTest
drop proc spTest
/*结果
name kcid kc sex gy nr
---------- ----------- ---------- ---- ---------- --------------------
aa 1 语文 男 good aa,1,语文,男,good
aa 2 数学 男 good aa,2,数学,男,good
aa 3 英语 男 good aa,3,英语,男,good
*/
[解决办法]
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),
sex varchar(4),gy varchar(10),nr varchar(100)) /*新增nr列*/
----创建测试数据
create table tbUsers(id int,name varchar(10),kcid int,
sex varchar(4)) /*users表新增sex列*/
insert tbUsers
select 1, 'aa ', 1, '男 ' union all
select 2, 'aa ', 2, '男 ' union all
select 3, 'bb ', 1, '女 ' union all
select 4, 'aa ', 3, '男 '
create table tbKc(kcid int,kc varchar(10))
insert tbKc
select 1, '语文 ' union all
select 2, '数学 ' union all
select 3, '英语 '
GO
----创建用游标插入记录的存储过程
CREATE PROC spTest @name varchar(10),@gy varchar(10)/*gy对应的参数*/
AS
SET NOCOUNT ON /*关闭回显*/
--定义变量,将游标中的每行读出到变量中用于处理或插入到表中
DECLARE @name2 varchar(10),@kcid int,@kc varchar(10),@sex varchar(4)
DECLARE @nr varchar(100) /*新增此变量*/
--定义游标
DECLARE cur CURSOR STATIC FOR
SELECT a.name,a.kcid,b.kc,a.sex
FROM tbUsers as a
LEFT JOIN tbKc as b on a.kcid = b.kcid
WHERE a.name = @name /*只查询参数@name指定的行*/
ORDER BY a.name,b.kcid
--打开游标
OPEN cur
--将游标定位到第一行
FETCH NEXT FROM cur INTO @name2,@kcid,@kc,@sex
WHILE @@FETCH_STATUS = 0 /*如果游标定位成功则进入循环体进行插入*/
BEGIN
--将读出的变量插入到tbTest表中.(可以在循环体中对读出的变量做任何处理)
set @nr = @name2 + ', ' + rtrim(@kcid) + ', ' + @kc + ', ' + @sex + ', ' + @gy
insert into tbTest(name,kcid,kc,sex,gy,nr) values(@name2,@kcid,@kc,@sex,@gy,@nr)
--当前行处理结束后游标向下移动一行
FETCH NEXT FROM cur INTO @name2,@kcid,@kc,@sex
END
--游标遍历结束后关闭游标
CLOSE cur
--释放游标所占用的资源
DEALLOCATE cur
GO
----执行存储过程,存储过程中使用游标将记录插入到tbTest表中
declare @name varchar(10),@gy varchar(10)
set @name = 'aa '
set @gy = 'good '
EXEC spTest @name,@gy
----查看
select * from tbTest
----清除测试环境
drop table tbUsers,tbKc,tbTest
drop proc spTest
/*结果
name kcid kc sex gy nr
---------- ----------- ---------- ---- ---------- --------------------
aa 1 语文 男 good aa,1,语文,男,good
aa 2 数学 男 good aa,2,数学,男,good
aa 3 英语 男 good aa,3,英语,男,good
*/
[解决办法]
create proc_class_qry
@name varchar(20)
AS
select name,kcid,kc
from users a,kc b
where a.kcid=b.kcid
and a.name=@@name
GO
[解决办法]
create table users
(
[id] int,
[name] varchar(50),
kcid int,
)
create table kc
(
kcid int,
kc varchar(50)
)
insert into users values(1, 'aa ',1)
insert into users values(2, 'aa ',2)
insert into users values(3, 'bb ',1)
insert into users values(4, 'aa ',3)
insert into kc values(1, '语文 ')
insert into kc values(2, '数学 ')
insert into kc values(3, '英语 ')
SELECT dbo.users.name, dbo.users.kcid, dbo.kc.kc
FROM dbo.users INNER JOIN
dbo.kc ON dbo.users.kcid = dbo.kc.kcid
WHERE (dbo.users.name = 'aa ')
[解决办法]
以上方法绝对ok!亲测
[解决办法]
select kc from kc where kcid in (select kcid from user where name= 'aa ')
[解决办法]
CREATE PROC S_std
@name varchar(10) --这里name的数据类型是和表users里字段name数据类型一样
AS
SELECT name,kc.kcid,kc
FROM users,kc
WHERE users.kcid=kc.kcid AND name=@name
GO
[解决办法]
ml_dark() ( ) 信誉:100 Blog 加为好友 2007-7-7 10:09:44 得分: 0
不晓得是我看错了还是怎么的?这么简单的,有人居然弄出来游标啊之类的。
估计是我真的看错了题~~~~~~~`
---------------------------------------------
to :ml_dark
您的水平很高不值得怀疑,但请在藐视别人之前先看清楼主的要求,是楼主要求用存储过程和游标两套方案的,看楼主的提问可能是初学者,所以代码会尽量详细些,以方便楼主这样的初学者理解.
[解决办法]
如果再跟贴下去,估计这贴都可以写一本书了.
楼主哪去了?没解决接着问,解决了就结贴!
严重BS问完问题就遨游太空去的这种人!
[解决办法]
郁闷,怎么有这样的结果的.就是简单的联表查询罢啦.楼主是否表达失误了.
select kc from kc where kcid in (select kcid from user where name= 'aa ')
这个应该就是需要的结果了.你自己先要测试一下就清楚了.
[解决办法]
没挑战性!
[解决办法]
select a.name,b.kcid,b.kc from users a,kc b where a.kcid = b.kcid and a.name= 'aa '
一条就可以了,不用写存储过程
[解决办法]
支持初学者!!!
[解决办法]
好长的帖子...
[解决办法]
楼主好可爱 :)
[解决办法]
怎么这么长啊
[解决办法]
呵呵,LZ是很可爱