本文主要讲解工作中经常会用到的用户自定义的存储过程的写法,以短小的例子为主,直接干货。
1、带输入参数存储过程
create proc proc_get_wlzd (@aswlbh varchar(10) )
as
select * from LSWLZD where LSWLZD_WLBH like @aswlbh+'%' ;
------调用、执行存储过程
exec proc_get_wlzd '01';
2、带输出参数存储过程
create proc proc_get_wlzd_out (
@aswlbh varchar(10),
@aswlmc varchar(30) out,
@ascbxm varchar(10) output )
as
select @aswlmc = LSWLZD_WLMC, @ascbxm = LSWLZD_CBXM from LSWLZD where LSWLZD_WLBH like @aswlbh+'%' ;
--------调用、执行存储过程
declare @aswlbh varchar(10),
@aswlmc varchar(30) ,
@ascbxm varchar(10) ;
set @aswlbh = '01';
set @ascbxm = '01';
exec proc_get_wlzd_out @aswlbh, @aswlmc out, @ascbxm output;
select @aswlmc, @ascbxm;
print @aswlmc + '#' + @ascbxm;
3、带游标参数存储过程
create proc proc_get_wlzd_cur (
@aswlbh varchar(10),
@cur cursor varying output)
as
set @cur = cursor forward_only static for
select LSWLZD_WLBH, LSWLZD_WLMC, LSWLZD_CBXM from LSWLZD where LSWLZD_WLBH like @aswlbh+'%' ;
open @cur ;
--------调用、执行存储过程
declare @exec_cur cursor,
@aswlbh varchar(10),
@aswlmc varchar(30) ,
@ascbxm varchar(10) ;
set @aswlbh = '01';
exec proc_get_wlzd_cur @aswlbh,@cur = @exec_cur output;--调用存储过程
fetch next from @exec_cur into @aswlbh, @aswlmc, @ascbxm;
while (@@fetch_status = 0)
begin
fetch next from @exec_cur into @aswlbh, @aswlmc, @ascbxm;
print 'wlbh: ' + @aswlbh + ', wlmc: ' + @aswlmc + ', cbxm: ' + @ascbxm;
end
close @exec_cur;
deallocate @exec_cur;--删除游标
4、分页存储过程
先讲一个常用的分页算法:
SELECT TOP 页大小 *
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id
下面是以此算法为基础编写的通用分页存储过程,sqlserver2008测试可以使用
CREATE PROCEDURE prcPageResult
-- 获得某一页的数据 --
@currPage int = 1, --当前页页码 (即Top currPage)
@showColumn varchar(2000) = '*', --需要得到的字段 (即 column1,column2,......)
@tabName varchar(2000), --需要查看的表名 (即 from table_name)
@strCondition varchar(2000) = '', --查询条件 (即 where condition......) 不用加where关键字
@ascColumn varchar(100) = '', --排序的字段名 (即 order by column asc/desc)
@bitOrderType bit = 0, --排序的类型 (0为升序,1为降序)
@pkColumn varchar(50) = '', --主键名称
@pageSize int = 20 --分页大小
AS
BEGIN -- 存储过程开始
-- 该存储过程需要用到的几个变量 --
DECLARE @strTemp varchar(1000)
DECLARE @strSql varchar(4000) --该存储过程最后执行的语句
DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)
BEGIN
IF @bitOrderType = 1 -- bitOrderType=1即执行降序
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC '
SET @strTemp = ' < ( SELECT min '
END
ELSE
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC '
SET @strTemp = ' > ( SELECT max '
END
IF @currPage = 1 -- 如果是第一页
BEGIN
IF @strCondition != ''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+@strOrderType
END
ELSE -- 其他页
BEGIN
IF @strCondition !=''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+
' '+@pkColumn+' FROM '+@tabName+@strOrderType+') AS TabTemp )'+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+@pkColumn+
' FROM '+@tabName+@strOrderType+') AS TabTemp )'+@strOrderType
END
END
--select @strSql
EXEC (@strSql)
END -- 存储过程结束
GO
-----调用方法,对于其他页(页数大于1的时候),一定要加PkID
----prcPageResult 1,'*','TableName','','CreateDate',1,'PkID',25
------prcPageResult 2,'*','LSWLZD','LSWLZD_wlbh like ''%'' ','LSWLZD_wlbh',0,'LSWLZD_wlbh',5
5、加密存储过程
create proc proc_get_wlzd_encryption (@aswlbh varchar(10))
with encryption
as
select LSWLZD_WLBH, LSWLZD_WLMC, LSWLZD_CBXM from LSWLZD where LSWLZD_WLBH like @aswlbh+'%' ;
GO
对于加密存储过程,使用一般的方法不能够看到存储过程的源码,可以使用sqldecryptor.exe这个小工具查看,虽然网上有好多利用存储过程解密的方法,但使用这个工具更方便一些。