sql 存储过程基础
2016-06-15 19:09
260 查看
1.存储过程,触发器等内部不能有GO
常用系统存储过程有:
(1)程序中的打印,及普通方法的使用
(2)声明,创建1个表
(3) 程序中的逻辑判断
(4)打开游标 关闭游标
(5)局部变量赋值 并返回
1.创建
无参数
带参数
局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}
局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}
局部变量的显示:select @变量名
参数带通配符
带输出参数的
不缓存 存储过程
带游标参数
常用系统存储过程有:
exec sp_databases; --查看数据库 exec sp_tables; --查看表 exec sp_columns student;--查看列 exec sp_helpIndex student;--查看索引 exec sp_helpConstraint student;--约束 exec sp_stored_procedures; exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句 exec sp_rename student, stuInfo;--修改表、索引、列的名称 exec sp_renamedb myTempDB, myDB;--更改数据库名称 exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库 exec sp_helpdb;--数据库帮助,查询数据库信息 exec sp_helpdb master;
(1)程序中的打印,及普通方法的使用
print ‘XXXXX’ ------------------------------------------------ declare @YYYY nvarchar(4) declare @MM nvarchar(2) declare @dd nvarchar(2) declare @_FirstTime DateTime declare @_LastTime DateTime -------函数的使用----------- set @YYYY = year(getdate()) set @MM = month(getdate()) set @dd = day(getdate()) set @_FirstTime = cast(@YYYY + '-' + @MM + '-' + @dd + ' 00:00:00' as DateTime) set @_LastTime = cast(@YYYY + '-' + @MM + '-' + @dd + ' 23:59:59' as DateTime)
(2)声明,创建1个表
DECLARE @Result TABLE(NumberStr NVARCHAR(100), HeadImg NTEXT, CreateDate DATETIME) //插入 INSERT INTO @Result(NumberStr, HeadImg, CreateDate) SELECT NumberStr, ISNULL([Image],''), CreateDate FROM TB_Check a WHERE UserID=CAST(@_UserID AS NVARCHAR(100)) AND [Type]=0 --AND RegisId =@_RegisId SELECT NumberStr, HeadImg, CreateDate FROM @Result ORDER BY NumberStr,CreateDate
(3) 程序中的逻辑判断
@BeginCallDate varchar(50), @EndCallDate varchar(50), @LogType varchar(50), @UserName varchar(50) as begin declare @strWhere varchar(500) set @strWhere='1=1 ' //--------------------------- if(@BeginCallDate!='' and @EndCallDate='') begin set @strWhere=@strWhere+' and CallDate>='''+cast(@BeginCallDate as varchar(50))+'''' end //-------------------------------- if(@BeginCallDate='' and @EndCallDate!='') begin set .................... end //-------------------------------------------- if(@BeginCallDate!='' and @EndCallDate!='') begin ...................... end exec(@strSql) end
(4)打开游标 关闭游标
open cur_CommByXzByds ---打开游标 //结束片段关闭 close cur_CommByXzByds
(5)局部变量赋值 并返回
begin declare @VideoTimes int; declare @ExamTimes int declare @ExamMark int //将结果赋值给VideoTimes select @VideoTimes = ISNULL(Sum(TimeCount), 0) from tb_VideoPlayNotes where.. //赋值结果 select @ExamMark = ISNULL(Max(MankCount), 0), @ExamTimes = ISNULL(Sum(TimeCount), 0) from tb_ExamTable where .... //拼接返回结果 select (@VideoTimes + @ExamTimes) as TimesCount, @ExamMark as ExamMark end
1.创建
无参数
if (exists (select * from sys.objects where name = 'XXX')) drop proc XXX go create proc XXX as //begin 和 end 是一对,不可以只写其中一个,但可以都不写 begin select * from student; end --调用、执行存储过程 exec proc_get_student;
带参数
create proc | procedure pro_name [{@参数数据类型} [=默认值] [output], {@参数数据类型} [=默认值] [output], .... ] as .... create proc XXX(@A int, @B int) as .......... @A and @B go //执行 exec XXX 1, 10; //后面的是参数 //也可以带上参数名称 exec XXX @A=1 ,@B=10
局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}
局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}
局部变量的显示:select @变量名
create proc XXX as declare @sname varchar(100) set @sname=(select Sname from student where S#=01) //显示局部变量 select @sname go exec StuProc
参数带通配符
create proc XXX(@name varchar(20) = '%j%', @nextName varchar(20) = '%') as select.... where name like @name and name like @nextName; go exec proc_findStudentByName; exec proc_findStudentByName '%o%', 't%';
带输出参数的
create proc XXX( @id int, --默认输入参数 @name varchar(20) out, --输出参数 @age varchar(20) output--输入输出参数 ) as ........ go //调用 declare @id int, @name varchar(20), @temp varchar(20); set @id = 7; set @temp = 1; exec XXX @id, @name out, @temp output; //返回的2个参数 select @name, @temp; print @name + '#' + @temp;
不缓存 存储过程
--WITH RECOMPILE 不缓存 create proc proc_temp with recompile //缓存 as go exec proc_temp;
带游标参数
if (object_id('proc_cursor', 'P') is not null) drop proc proc_cursor go create proc proc_cursor @cur cursor varying output as set @cur = cursor forward_only static for select id, name, age from student; open @cur; go --调用 declare @exec_cur cursor; declare @id int, @name varchar(20), @age int; exec proc_cursor @cur = @exec_cur output;--调用存储过程 fetch next from @exec_cur into @id, @name, @age; while (@@fetch_status = 0) begin fetch next from @exec_cur into @id, @name, @age; print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age); end close @exec_cur; deallocate @exec_cur;--删除游标