SQL server存储过程,触发器,游标相关实例

时间:2023-03-09 07:40:35
SQL server存储过程,触发器,游标相关实例
 use MySchool
go alter proc P_stu
@pass int= 60
as
select AVG(StudentResult)as 平均分
from Result select * from Result
where StudentResult< @pass
go exec P_stu go ---创建带输出参数的存储过程 select * from Result
go alter procedure p_res
@newId varchar(20) output
as
declare @max varchar(20) select @max=MAX(StudentNo) from Result
where YEAR(ExamDate) = YEAR(GETDATE())
and month(ExamDate) = month(GETDATE())
and day(ExamDate) = day(GETDATE()) if (@max is null)
set @newId = CONVERT(varchar(100),GETDATE(),23)+''
else
begin
declare @right int
set @right = CONVERT(int,right(@max,3))
set @right = @right +1
set @newId = CONVERT(varchar(100),GETDATE(),23)+'-'+(case when @right < 10 then '' when @right<100 then '' end)+ CONVERT(varchar(10),@right) end
go declare @rst varchar(20)
exec p_res @rst output
print @rst --动态存储过程的数据处理 --分页存储过程
--要求
--可输入每页显示条数,默认每页条
--可输入页码进行查询
--可输入条件查询
--可输入表名
--可输入列名
--可输入排序列
--返回总记录数
--返回总页数
--返回查询到的结果
select * from Subject
go if exists(select * from sysobjects
where name = 'p_Mypage')
drop procedure p_Mypage
go create proc p_Mypage
@tableName varchar(20),
@Fields varchar(200),
@orderFields varchar(200),
@where varchar(200),
@pageSize int = 5,
@pageIndex int = 1,
@RecordCount int output,
@PageCount int output with encryption--文本加密
--with recomple--每次都重新编译
as declare @sql nvarchar(4000) set @sql = 'select @RecordCount=count(*) from'+ @tableName+'where 1= 1'+ISNULL(@where,' ') exec sp_executesql @sql,N'@RecordCount int output',@RecordCount output
set @PageCount = ceiling((@RecordCount+0.0)/@pageSize)、 set @sql = '
select * from(
select top '+ CONVERT(varchar(10),@pageSize)+' '+@Fields+' from(
select top '+ CONVERT(varchar(10),@pageSize*@pageIndex)+' * from '+@tableName+'
where 1= 1'+ISNULL(@where,' ')+'
order by '+@orderFields+' )as a
order by a.'+@orderFields+' desc) as b
order by b.SubjectNo' exec (@sql) declare @a int ,@b int
exec p_Mypage @tableName= 'Subject',@Fields = '*',
@orderFields = 'SubjectNo',@where=null,
@pageSize = 5,@pageIndex = 2,@RecordCount = @a output,
@PageCount = @b output
print @a
print @b --游标 declare sur_stu cursor scroll for
select StudentName from Student for read only
open sur_stu declare @name varchar(20)
declare @i int
set @i = 1;
fetch next from cur_stu into @name
while(@@FETCH_STATUS<> -1)
begin
if(@i = 3)
begin
print @name
set @i=0
end
fetch next from cur_stu into @name
set @i=@i +1 end close sur_stu
deallocate sur_stu --使用游标和查存储过程创建分页 性能最差
create procedure sqlPage
@sql nvarchar (4000),
@pageIndex int,
@pageSize int,
@recordCount int output,
@pageCount int output
as
declare @p1 int
exec sp_cursoropen @p1 output,@sql,@scrollopt= 1, @ccopt = 1,@rowcount= @recordCount output
set @pageCount = CEILING((@recordCount+0.0)/@pageSize)
exec sp_cursorfetch @p1,16,@pageIndex,@pageSize
exec sp_cursorclose @p1 declare @a int ,@b int
exec sqlPage 'select * from student',1,5,@a output,@b output
print @a
print @b