一、事例:如果对一个大学生三年成绩的查询通过学生学号,学生成绩按学期存放在不同的表中,成绩表如下:
cjxx20051 也就是存放学生2005年第一学期的成绩:
cjxx20052 也就是存放学生2005年第二学期的成绩:
cjxx20061 也就是存放学生2005年第一学期的成绩:
cjxx20062 也就是存放学生2005年第二学期的成绩:
cjxx20071 也就是存放学生2005年第一学期的成绩:
cjxx20072 也就是存放学生2005年第二学期的成绩:
二、问题,写一个存储过程,要求根据学号查到此学生三年的各科成绩汇总
--创建存储过程---
ALTER proc [dbo].[GetByCjByxh]
--参数xh
@xh int
as
----print @xh
---变量声明
declare @year int
set @year=2005
-----创建临时表#temptable用于存放学生成绩信息
create table #temptable(kch varchar(20),xnd int,xq int,fs int,bkcj int)
declare @nowYear int
set @nowYear=year(getdate())
while @year<=@nowYear
begin
declare @xq int
set @xq=1
while @xq<=2
begin
-- declare @cjxxTable1 char(9)
-- set @cjxxTable1='"cjxx'+cast(@year as char(4))+'1"'
------声明变量·cjxxTable动态用于标记各年成绩表
declare @cjxxTable char(9)
set @cjxxTable='cjxx'+cast(@year as char(4)) +cast(@xq as char(1))--此语句第一次执行为cjxx20051,二
--print @cjxxTable
if exists(select name from sysobjects where name=@cjxxTable and type='U')--判断表cjxxTable是否存在
BEGIN
declare @sqlstr nvarchar(1000)
SET @sqlstr='insert into #temptable(kch,xnd,xq,fs,bkcj) select kcbh,'+cast(@year as char(4))+','+cast(@xq as char(1))+',cj,bkcj from '+@cjxxTable+' where xh='+cast(@xh as char(8))
---执行语句
exec sp_executesql @sqlstr
print @sqlstr
end
set @xq=@xq+1
end
set @year=@year+1
end
select * from #temptable