☆☆☆会做这道题的进☆☆☆

hhaoma 2008-05-21 05:18:37
--题目:在数据库中编写一个名为sp_findstusir的存储过程,以学生姓名作为输入参数,如果找到此学生则用游标标出此学生的班主任姓名,否则提示没找到;
--请看清楚要求再下手

----------------------------下面这个是同学表和班主任表,关系用学号相连
create database 我班同学库
go
use 我班同学库
go

go
create table 同学表(
学号 varchar(6) primary key,
姓名 varchar(8) not null,
性别 varchar(2) default '男',
出生日期 datetime,
年龄 int,
身份证号 varchar(18) unique,
宿舍编号 varchar (3) )
go
insert 同学表 values('061201','张三','女','1988-11-23',20,'421022198811233025','001')
insert 同学表 values('061202','李四','男','1987-1-12',21,'421022198701123025','001')

create table 班主任表(
学号 varchar(6) primary key,
班主任 varchar(12)not null)
go
insert 班主任表 values('061201','王五')
insert 班主任表 values('061202','王五')

----------------------------------
--下面这个是示例,意思是说输入‘同学’能显示同学表
--想把它改写成在存储过程中输入‘姓名’然后能显示出班主任姓名

IF EXISTS(SELECT name FROM sysobjects WHERE name='DispTab3' AND type='P')
DROP PROCEDURE DispTab3
GO
--建立存储过程
CREATE PROCEDURE DispTab3
@SelectKey VARCHAR(12), --定义输入参数,及默认值
@ColumnKey VARCHAR(6)='*', --定义输入参数,及默认值
@ListTab CURSOR VARYING OUTPUT --定义游标作为输出参数
AS
DECLARE @TableNam VARCHAR(20)
SELECT @TableNam =
CASE
WHEN @SelectKey LIKE '%同学%' THEN '同学表'
ELSE NULL
END
IF @TableNam IS NULL --如果是空则显示消息
RAISERROR('没有找到对应的表!',6,6)
ELSE
BEGIN
EXECUTE ( --执行字符串查询语, 建立临时游标
'DECLARE TempCs CURSOR FOR SELECT '
+@ColumnKey+' FROM '+@TableNam)
SET @ListTab=TempCs --设置临时游标给输出参数
OPEN @ListTab --打开游标
DEALLOCATE TempCs --释放临时游标
END
GO
--建立存储过程结束,执行存储过程
declare @SelectKey VARCHAR(12)
DECLARE @DispData CURSOR
EXECUTE DispTab3 @ListTab=@DispData OUTPUT,
@SelectKey='同学'
FETCH NEXT FROM @DispData --循环输出游标内容
WHILE (@@FETCH_STATUS=0)
FETCH NEXT FROM @DispData
CLOSE @DispData
DEALLOCATE @DispData
GO
-----------------------------------------------------
--下面这个是一个高手写的,不过老师说这样做没按要求。要改写成像上面一题的类型一样。
create proc sp_findstusir
@name varchar(8)
as
declare @sno varchar(6)
declare cursor_sno cursor for select 学号 from 同学表 where 姓名=@name
open cursor_sno
fetch next from cursor_sno into @sno
while @@fetch_status = 0
begin
select 班主任 from 班主任表 where 学号=@sno
fetch next from cursor_sno into @sno
end
close cursor_sno
deallocate cursor_sno

if @sno is null select 班主任='none'
go
--建立存储过程结束,执行存储过程
exec sp_findstusir @name='张三'
----------------------------------请大家帮忙解决下啦~~谢谢啦
...全文
185 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
codeangel 2008-05-22
  • 打赏
  • 举报
回复
都写出来了,接分
忆轩辕 2008-05-21
  • 打赏
  • 举报
回复
create PROCEDURE OpenCrsr
@姓名 varchar(50),
@OutCrsr CURSOR VARYING OUTPUT
AS
SET @OutCrsr = CURSOR FOR SELECT 学号 FROM 同学表 WHERE 姓名=@姓名
OPEN @OutCrsr
GO

create proc p_wsp
@姓名 varchar(50)
as
declare @j int
set @j = 0
declare @学号 varchar(12)
DECLARE @CrsrVar CURSOR
EXEC OpenCrsr @姓名=@姓名,@OutCrsr = @CrsrVar OUTPUT
FETCH NEXT FROM @CrsrVar into @学号
WHILE(@@FETCH_STATUS=0)
BEGIN
select 班主任 from 班主任表 where 学号=@学号
if @@rowcount <> 0
begin
set @j = 1
end
FETCH NEXT FROM @CrsrVar
END
CLOSE @CrsrVar
DEALLOCATE @CrsrVar
if @j = 0
begin
select '未找到该学生的班主任'
end
GO

exec p_wsp '张三'
hhaoma 2008-05-21
  • 打赏
  • 举报
回复
能弄个完整版本的吗?
忆轩辕 2008-05-21
  • 打赏
  • 举报
回复
补上一些

declare @j int
set @j = 0
.
.
.
.
.
BEGIN
select 班主任 from 班主任表 where 学号=@学号
if @@rowcount <> 0
begin
set @j = 1
end
FETCH NEXT FROM @CrsrVar
END
.
.
if @j = 0
begin
select '未找到'
end
hhaoma 2008-05-21
  • 打赏
  • 举报
回复
谢谢啦~~~来者有分呵呵~~
pt1314917 2008-05-21
  • 打赏
  • 举报
回复

--调用存储过程
declare @学号 varchar(12)
DECLARE @CrsrVar CURSOR
EXEC OpenCrsr @姓名='张三',@OutCrsr = @CrsrVar OUTPUT
FETCH NEXT FROM @CrsrVar into @学号
WHILE(@@FETCH_STATUS=0)
BEGIN
select 班主任 from 班主任表 where 学号=@学号
FETCH NEXT FROM @CrsrVar
END
CLOSE @CrsrVar
DEALLOCATE @CrsrVar
GO

---把这个也改成存储过程吧
create table 同学表(
学号 varchar(6) primary key,
姓名 varchar(8) not null,
性别 varchar(2) default '男',
出生日期 datetime,
年龄 int,
身份证号 varchar(18) unique,
宿舍编号 varchar (3) )
go
insert 同学表 values('061201','张三','女','1988-11-23',20,'421022198811233025','001')
insert 同学表 values('061202','李四','男','1987-1-12',21,'421022198701123025','001')

create table 班主任表(
学号 varchar(6) primary key,
班主任 varchar(12)not null)
go
insert 班主任表 values('061201','王五')
insert 班主任表 values('061202','王五')


create PROCEDURE OpenCrsr
@姓名 varchar(50),
@OutCrsr CURSOR VARYING OUTPUT
AS
SET @OutCrsr = CURSOR FOR SELECT 学号 FROM 同学表 WHERE 姓名=@姓名
OPEN @OutCrsr
GO

create proc p_wsp
@姓名 varchar(50)
as
declare @学号 varchar(12)
DECLARE @CrsrVar CURSOR
EXEC OpenCrsr @姓名=@姓名,@OutCrsr = @CrsrVar OUTPUT
FETCH NEXT FROM @CrsrVar into @学号
WHILE(@@FETCH_STATUS=0)
BEGIN
select 班主任 from 班主任表 where 学号=@学号
FETCH NEXT FROM @CrsrVar
END
CLOSE @CrsrVar
DEALLOCATE @CrsrVar
GO

exec p_wsp '张三'

pt1314917 2008-05-21
  • 打赏
  • 举报
回复

create table 同学表(
学号 varchar(6) primary key,
姓名 varchar(8) not null,
性别 varchar(2) default '男',
出生日期 datetime,
年龄 int,
身份证号 varchar(18) unique,
宿舍编号 varchar (3) )
go
insert 同学表 values('061201','张三','女','1988-11-23',20,'421022198811233025','001')
insert 同学表 values('061202','李四','男','1987-1-12',21,'421022198701123025','001')

create table 班主任表(
学号 varchar(6) primary key,
班主任 varchar(12)not null)
go
insert 班主任表 values('061201','王五')
insert 班主任表 values('061202','王五')



--创建输出游标存储过程
create PROCEDURE OpenCrsr
@姓名 varchar(50),
@OutCrsr CURSOR VARYING OUTPUT
AS
SET @OutCrsr = CURSOR FOR SELECT 学号 FROM 同学表 WHERE 姓名=@姓名
OPEN @OutCrsr
GO

--调用存储过程
declare @学号 varchar(12)
DECLARE @CrsrVar CURSOR
EXEC OpenCrsr @姓名='张三',@OutCrsr = @CrsrVar OUTPUT
FETCH NEXT FROM @CrsrVar into @学号
WHILE(@@FETCH_STATUS=0)
BEGIN
select 班主任 from 班主任表 where 学号=@学号
FETCH NEXT FROM @CrsrVar
END
CLOSE @CrsrVar
DEALLOCATE @CrsrVar
GO

hhaoma 2008-05-21
  • 打赏
  • 举报
回复
学sql的最高境界就是能把这道题写出来贴上去!!!麻烦大家帮帮忙啊`~~~
忆轩辕 2008-05-21
  • 打赏
  • 举报
回复
都能写,就是感觉没必要
hhaoma 2008-05-21
  • 打赏
  • 举报
回复
谢谢大家啦~~
hhaoma 2008-05-21
  • 打赏
  • 举报
回复
谁能完整的写出来啊???

这老师也太严了点啦~
忆轩辕 2008-05-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ojuju10 的回复:]

很简单的啊,把上面的改成存储过程就可以了
[/Quote]

那个老师要求拥游标。。。。。。。。orz
ojuju10 2008-05-21
  • 打赏
  • 举报
回复

很简单的啊,把上面的改成存储过程就可以了
ojuju10 2008-05-21
  • 打赏
  • 举报
回复


declare @name varchar(100)
set @name='张三'

select b.班主任 from 同学表 a,班主任表 b
where a.学号=b.学号 and a.姓名=@name

子陌红尘 2008-05-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liangCK 的回复:]
引用 1 楼 flairsky 的回复:
在数据库中编写一个名为sp_findstusir的存储过程,以学生姓名作为输入参数,如果找到此学生则用游标标出此学生的班主任姓名

有必要用游标么?


有..这是个欠抽的老师
[/Quote]

呵呵,这个老师只是想让学生学习用游标,举的例子不太合适......
忆轩辕 2008-05-21
  • 打赏
  • 举报
回复
其他的看看联机帮助补全吧
pt1314917 2008-05-21
  • 打赏
  • 举报
回复
非要用游标?
忆轩辕 2008-05-21
  • 打赏
  • 举报
回复
declare @name varchar(10)

set @name = ''
select 班主任 from 班主任表 where 学号 =(select 学号 from 同学表 where 姓名 = @name )
子陌红尘 2008-05-21
  • 打赏
  • 举报
回复
做题??

游标????

老师??????
Limpire 2008-05-21
  • 打赏
  • 举报
回复
你老师这个示例太高了
加载更多回复(3)

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧