2023年6月21日发(作者:)

SQLSERVER存储过程详解及相关实例SQL SERVER 存储过程**相对于视图的优势(为什么使⽤存储过程):** Sql Server中视图通过简单的Select查询来解决多次复杂的查询,但是视图不能提供业务逻辑的功能,⽽存储过程可以。 **什么是存储过程:**存储过程(Procedure)是⼀组为了完成特定功能的Sql语句集合,相当于C#中的⽅法,只编译⼀次,经编译后存储在数据库中,⽤户可以通过制定的存储过程名称并给出所需参数来执⾏存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接收参数,输出参数,返回单个,多个结果集和返回值。正是由于存储过程只编译⼀次,所以它⽐单个Sql语句块要快速, 所以在⼀定程度上减少了⽹络流量,减轻⽹络负担。存储过程的优点:模块化编程性能安全可维护性写⼀次存储过程,可以多次从应⽤程序的不同部分调⽤,重复使⽤存储过程提供更快的代码执⾏,减少了⽹络流量负担。⽤户⽆需使⽤写任何Sql语句去执⾏存储过程,防⽌了Sql注⼊攻击⼀组需求改变,修改存储过程即可再次重复调⽤存储过程缺点:不可移植性每种数据库的内部编程语法都不太相同,当你的系统需要兼容多种数据库时最好不要⽤存储过程。存储过程有复杂运算,或者复杂运算过多的话,会增加数据库运⾏的负担。学习成本⾼,DBA⼀般都擅长写存储过程,但并不是每个程序员都能写好存储过程,除⾮你的团队有较多的开发⼈员熟悉写存储过程,否则后期系统维护会产⽣问题。SQL SERVER写⼀个存储过程:CREATE PROC MyPage(@name nvarchar(10),@page decimal output)ASBEGINselect * from studentsEND执⾏存储过程:declare @p decimal--创建Sql变量declare @n nvarchar(5)set @n='张三'--为Sql变量赋值EXEC MyPage @n,@p out--调⽤存储过程select @p修改(删除)存储过程alter proc proc_nameasbegin  --sql语句end  --删除存储过程drop proc proc_name(相关实例)分页存储过程--存储过程分页alter PROC NesList(@a int,--第⼏页@b int,--每页⾏数@sum int output,--总⾏数@str int output,--总页数@result nvarchar(100) output--结果)ASBEGIN

--总⾏数Select @sum=count(*) from NewsListTable--总页数set @str=CEILING(@sum*1.0/@b)if(@a<0 or @a>@str)beginset @result='页码错误!'end--分页数据select as '新闻编号',tle as '新闻类别',te as '新闻发布时间' from

( SELECT *,RN=ROW_NUMBER() OVER(order by NewsId) FROM NewsListTable) as t where between ((@a-1)*@b)+1 and @a*@b --between and

包括两边值END-------测试存储过程--测试declare @nub intset @nub=-1declare @nm intset @nm=2declare @countsum intdeclare @countye intdeclare @re nvarchar(100)exec NesList @nub,@nm,@countsum out,@countye out,@re outselect @countsum,@countye,@reVS调⽤存储过程实现分页: private int a = 1;//第⼏页 private int b = 7;//每页数据⾏数 private int sum;//总数据⾏数 private int str;//总页数 //利⽤SqlDataAdapter进⾏数据读取绑定 string connstr = "*****************"; DataTable u = new DataTable(); using (SqlDataAdapter con = new SqlDataAdapter("USP_Students", connstr)) { dType = Procedure; SqlParameter[] pms = { new SqlParameter ("@A",) {Value=a }, new SqlParameter ("@B",) { Value=b}, new SqlParameter ("@SUM",) { Direction=}, new SqlParameter ("STR",) { Direction=} }; ge(pms); (u); = pms[2].ng();//获取输出参数 = pms[3].ng(); = ng(); urce = u; }

2023年6月21日发(作者:)

SQLSERVER存储过程详解及相关实例SQL SERVER 存储过程**相对于视图的优势(为什么使⽤存储过程):** Sql Server中视图通过简单的Select查询来解决多次复杂的查询,但是视图不能提供业务逻辑的功能,⽽存储过程可以。 **什么是存储过程:**存储过程(Procedure)是⼀组为了完成特定功能的Sql语句集合,相当于C#中的⽅法,只编译⼀次,经编译后存储在数据库中,⽤户可以通过制定的存储过程名称并给出所需参数来执⾏存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接收参数,输出参数,返回单个,多个结果集和返回值。正是由于存储过程只编译⼀次,所以它⽐单个Sql语句块要快速, 所以在⼀定程度上减少了⽹络流量,减轻⽹络负担。存储过程的优点:模块化编程性能安全可维护性写⼀次存储过程,可以多次从应⽤程序的不同部分调⽤,重复使⽤存储过程提供更快的代码执⾏,减少了⽹络流量负担。⽤户⽆需使⽤写任何Sql语句去执⾏存储过程,防⽌了Sql注⼊攻击⼀组需求改变,修改存储过程即可再次重复调⽤存储过程缺点:不可移植性每种数据库的内部编程语法都不太相同,当你的系统需要兼容多种数据库时最好不要⽤存储过程。存储过程有复杂运算,或者复杂运算过多的话,会增加数据库运⾏的负担。学习成本⾼,DBA⼀般都擅长写存储过程,但并不是每个程序员都能写好存储过程,除⾮你的团队有较多的开发⼈员熟悉写存储过程,否则后期系统维护会产⽣问题。SQL SERVER写⼀个存储过程:CREATE PROC MyPage(@name nvarchar(10),@page decimal output)ASBEGINselect * from studentsEND执⾏存储过程:declare @p decimal--创建Sql变量declare @n nvarchar(5)set @n='张三'--为Sql变量赋值EXEC MyPage @n,@p out--调⽤存储过程select @p修改(删除)存储过程alter proc proc_nameasbegin  --sql语句end  --删除存储过程drop proc proc_name(相关实例)分页存储过程--存储过程分页alter PROC NesList(@a int,--第⼏页@b int,--每页⾏数@sum int output,--总⾏数@str int output,--总页数@result nvarchar(100) output--结果)ASBEGIN

--总⾏数Select @sum=count(*) from NewsListTable--总页数set @str=CEILING(@sum*1.0/@b)if(@a<0 or @a>@str)beginset @result='页码错误!'end--分页数据select as '新闻编号',tle as '新闻类别',te as '新闻发布时间' from

( SELECT *,RN=ROW_NUMBER() OVER(order by NewsId) FROM NewsListTable) as t where between ((@a-1)*@b)+1 and @a*@b --between and

包括两边值END-------测试存储过程--测试declare @nub intset @nub=-1declare @nm intset @nm=2declare @countsum intdeclare @countye intdeclare @re nvarchar(100)exec NesList @nub,@nm,@countsum out,@countye out,@re outselect @countsum,@countye,@reVS调⽤存储过程实现分页: private int a = 1;//第⼏页 private int b = 7;//每页数据⾏数 private int sum;//总数据⾏数 private int str;//总页数 //利⽤SqlDataAdapter进⾏数据读取绑定 string connstr = "*****************"; DataTable u = new DataTable(); using (SqlDataAdapter con = new SqlDataAdapter("USP_Students", connstr)) { dType = Procedure; SqlParameter[] pms = { new SqlParameter ("@A",) {Value=a }, new SqlParameter ("@B",) { Value=b}, new SqlParameter ("@SUM",) { Direction=}, new SqlParameter ("STR",) { Direction=} }; ge(pms); (u); = pms[2].ng();//获取输出参数 = pms[3].ng(); = ng(); urce = u; }