SQL SERVER-9-存储过程

存储过程
--1.简化代码,减少网络流通量,只需要传输存储过程名称,不需要过长的SQL语句
--2.带参数,防止SQL注入攻击,与带参数的sql语句一样的效果,带参数的sql语句其实调用的就是sp_executesql存储过程
--3.存储过程是在数据库中已经预编译过的,效率会比较高

--系统存储过程
--由系统定义,存储在master数据库中
exec sp_databases                         --列出数据库中所有的数据库
exec sp_helpdb                             --报告指定数据库或者所有数据库的信息
exec sp_tables                           --返回当前环境下可查询对象的列表
exec sp_columns    'NIS_ADDINS'             --返回某个表列的信息
exec sp_help 'NIS_ADDINS'                 --查看某个表的所有信息
exec sp_helpconstraint 'NIS_ADDINS'         --查看某个表的约束
exec sp_helpindex 'NIS_ADDINS'             --查看某个表的索引
exec sp_stored_procedures                 --列出当前环境中的所有存储过程
exec sp_helptext 'sp_helptext'             --显示默认值,未加密的存储过程,用户定义的存储过程,触发器,或视图的实际文本
sp_password                                 --添加或修改登录账户的密码
sp_renamedb                                 --更改数据库的名称

--自定义存储过程
--是我们在编程中根据需要自定义的存储过程

--系统存储过程名称以sp_开头,自定义的存储过程使用usp_开头

--存储过程的定义语法
create proc [存储过程名称]

--接下来是参数定义,如果没有参数,可以省略
@name varchar(64),
@id   int

as  --as必须带

begin
--数据操作sql

end


--创建一个存储过程,查询菜单信息
create proc usp_addins
    @id      varchar(64)   --菜单的ID
as
begin
    if(@id='')
    begin
        select * from NIS_ADDINS
    end
    else
    begin
        select * from NIS_ADDINS WHERE ID =@id
    end
end
--调用
exec usp_addins ''
exec usp_addins '0223D9CB-8725-4B7D-8E05-FC41FBC2F0AD'

--创建一个执行加操作的存储过程
create procedure usp_add
    @num1 int,
    @num2 int
as
begin
    select @num1+@num2
end

--调用存储过程
--可以指定参数为其赋值
exec usp_add @num1=100,@num2=200
--也可以根据参数的顺序赋值
exec usp_add 100,200


--创建存储过程的时候,也可以为参数设置默认值
--先删除执行加操作的存储过程
--drop proc usp_add
--有默认值的存储过程
alter proc usp_add
    --设置参数,并且为参数设置默认值
    @num1 int=200,
    @num2 int=300
as
begin
    select @num1+@num2
end
--调用存储过程,设置默认参数之后也可以像普通的存储过程调用一样传递参数
exec usp_add 900,900
--也可以不为默认参数传值,如果所有参数都有默认值,在调用存储过程的时候可以不传递参数
exec usp_add
exec usp_add 900
exec usp_add @num2=900

--如果有参数有默认值,有些参数没有默认值,在创建的时候要注意参数的顺序,在调用的时候也要注意传值的顺序,或者干脆直接知名参数然后传值
--最好把有默认值的参数放到后面,否则在调用的时候一定要注意传值的顺序
--示例1
alter proc usp_add
    --第一个没有默认值,第二个有默认值
    @num1 int,
    @num2 int=300
as
begin
    select @num1+@num2
end
--调用如下
exec usp_add 900
exec usp_add 900,900
exec usp_add @num1=900

--示例2
alter proc usp_add
    --第一个有默认值,第二个没有默认值
    @num1 int=200,
    @num2 int
as
begin
    select @num1+@num2
end
--调用存储过程
--要么所有参数都传值,要么指定传值的参数名称
exec usp_add 900,900
exec usp_add @num2=900
--如下的调用会出错,他会默认把第一个值传递给第一个参数,导致第二个没有默认值的参数没有传值
exec usp_add 900   

--创建带输出参数的存储过程

--根据班级Id查询学生信息并同时返回一个查询到的记录的条数
create proc usp_selectStuInfoByClsId
    @classId int,  --学生ID
    @recordCount int output  --输出参数
as
begin
    select * from TblStudent where tsclassId=@classId
    select @recordCount=count(*) from TblStudent where tsclassId=@classId
end
--调用存储过程方式如下
declare @rc int
exec usp_selectStuInfoByClsId @classId=5,@recordCount=@rc output
print @rc


--实现分页的存储过程
create proc usp_getAddinsByPage
    @pageSize int,      --每页的记录条数
    @pageIndex int,     --用户当前要查看第几页
    @pageCount int output --输出参数,返回总共有几页
as
begin
    --查询NIS_ADDINS表的记录
    select * from
    (
        --先根据规则查询出所有数据并且编号
        select
            *,
            Rn=row_number() over(order by ZYMC asc)
        from NIS_ADDINS
    ) as addins
    --返回从(当前页-1)*每页条数 然后在+1,到当前页*每页条数
    where addins.Rn between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize
    
    --返回总页数
    --1.先计算总记录条数
    declare @rdCount int
    select @rdCount=count(*) from NIS_ADDINS
    
    --2.计算页数,ceiling函数取上限,只入不舍
    set @pageCount=ceiling(@rdCount/(@pageSize*1.0))
end
--调用存储过程
declare @pc int
exec usp_getAddinsByPage @pageSize=5,@pageIndex=19, @pageCount=@pc output
print @pc


--ceiling函数向上取整数
declare @mm  int
set @mm=ceiling(11/(5*1.0))
print @mm


--增加数据的存储过程
create proc usp_insertToPerson
    @uname nvarchar(50),
    @uage int,
    @uheight int
as
begin
    --执行完成之后返回新增数据的ID
    insert into TblPerson output inserted.autoId values(@uname,@uage,@uheight)
end
--调用新增的存储过程
usp_insertToPerson '杨鹏立',18,180


--删除数据的存储过程
create proc usp_deletePerson
    @autoId int
as
begin
    delete from TblPerson where autoId=@autoId
end


--更新数据的存储过程
create proc usp_updatePerson
    @autoId int,
    @uname nvarchar(50),
    @uage int,
    @uheight int
as
begin
    update TblPerson set uname=@uname,uage=@uage,uheight=@uheight where autoId=@autoId
end


--查询数据的存储过程
create proc usp_selectAllPerson
as
begin
    select * from TblPerson
end

--关于order by排序

--一般情况可以使用如下的方式
select * from NIS_ADDINS order  by ID asc
--还有一种方式如下,order by 后面的2表示按照返回值的第二列进行升序排列
select * from NIS_ADDINS order  by 2 asc

猜你喜欢

转载自blog.csdn.net/m0_37532448/article/details/82868201