SQL Server存储过程的初步认知
什么是存储过程?
存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。实际上存储过程就是能完成一定操作的一组SQL语句。
为什么要用存储过程?
1、 存储过程只在创造时候编译,以后每次执行存储过程都不需要再重新的编译,而一般的SQL语句每执行一次就需要编译一次,所以使用存储过程可提高数据库执行速度。
2、 当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事物处理结合在一起。
3、 存储过程可以重复的使用,降低开发人员的工作量,提高工作效率。
4、 安全性高,可以设定只有某些用户才具有对指定存储过程的使用权。
那存储过程怎么使用呢?
创建一个表作为展示存储过程的例子
CREATE TABLE [dbo].[student]( [ID] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](100) NULL, [sex] [int] NULL, [age] [int] NULL, [idcard] [nvarchar](50) NULL, [homeaddress] [nvarchar](500) NULL, [description] [nvarchar](500) NULL, CONSTRAINT [PK_student] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
创造一些数据作为查询的条件:
实际的生产中有两种使用方式(PS:无参和有参数):
无参数的存储过程:
实际生产中主要用在根据条件查询表或者不需要条件的处理表。
还是依据大家的传统,直接的做个查询吧!
1、创建存储过程
CREATE PROC QueryStu as --此处的as作为语法规则必须写,但是什么作用还需要研究 BEGIN --BEGIN 和 END 是一对,作为代码段同时出现使用,在if else 的时候也需要的进行分割,类似于C#上的{ } SELECT * FROM [dbo].[student] END
2、创建完成后做个查询:
--执行存储过程 exec [dbo].[QueryStu]
有参数的存储过程:
全局变量(PS:点击全局变量,进入我的SQL变量介绍传送门)
全局变量是由两部分一种是系统内部事先定义好的变量用@@使用,不需要我们进行定义。另一种是它在函数外部定义的变量,作用域是从变量定义处开始,到本程序文件的末尾结束。
CREATE PROC [dbo].[QueryStu1] @name varchar(100) as --此处的as作为语法规则必须写,但是什么作用还需要研究 BEGIN --BEGIN 和 END 是一对,作为代码段同时出现使用,在if else 的时候也需要的进行分割,类似于C#上的{ } SELECT * FROM [dbo].[student] where name = @name END GO exec [QueryStu1] '张三' --执行存储过程
上面这种是实际生产中应用的,还有另外一种方式就是直接的在内部给变量赋值,如下所示,不过这种方式在实际的生产中基本不会出现这种使用方式:
CREATE PROC [dbo].[QueryStu2] @name varchar(100) = '李四' as --此处的as作为语法规则必须写,但是什么作用还需要研究 BEGIN --BEGIN 和 END 是一对,作为代码段同时出现使用,在if else 的时候也需要的进行分割,类似于C#上的{ } SELECT * FROM [dbo].[student] where name = @name END GO exec [QueryStu2] --执行存储过程
在实际调用过程中,可能会需要访问存储过程中的某一信息,那么使用output可是实现这一需求,下面的例子是我需要使用存储过程中查询出来的人的年龄
CREATE PROC [dbo].[QueryStu3] @name varchar(100), @age int output --传出参数 as --此处的as作为语法规则必须写,但是什么作用还需要研究 BEGIN --BEGIN 和 END 是一对,作为代码段同时出现使用,在if else 的时候也需要的进行分割,类似于C#上的{ } set @age = (SELECT age FROM [dbo].[student] where name = @name) END GO declare @age int exec [dbo].[QueryStu3] '王五',@age output --执行存储过程 SELECT @age
局部变量
1、 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。
2、 局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名数据类型}
3、 局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式} 局部变量的显示:select @变量名
内部赋值处理
CREATE PROC [dbo].[QueryStu6] as --此处的as作为语法规则必须写,但是什么作用还需要研究 declare @name varchar(100) set @name='李四' BEGIN --BEGIN 和 END 是一对,作为代码段同时出现使用,在if else 的时候也需要的进行分割,类似于C#上的{ } SELECT * FROM [dbo].[student] where name = @name END GO EXEC [dbo].[QueryStu6]
那如果是要把局部变量的数据显示出来怎么办呢?这么用
CREATE PROC [dbo].[QueryStu8] as --此处的as作为语法规则必须写,但是什么作用还需要研究 declare @name varchar(100) BEGIN --BEGIN 和 END 是一对,作为代码段同时出现使用,在if else 的时候也需要的进行分割,类似于C#上的{ } SET @name = (SELECT name FROM [dbo].[student] where name='张三') SELECT @name END GO EXEC [dbo].[QueryStu8]
但是这种用法存在一种问题就是,只能查个结果的内容,实际生产上用的不多。
参考博客:
[1] SQL SERVER之存储过程基础知识:http://www.cnblogs.com/jiajiayuan/archive/2011/06/15/2081201.html
[2] SQL SERVER 删除前先判断指定的表或者存储过程是否存在 : http://blog.csdn.net/baidu_32731497/article/details/51591087
[3] SQL Server存储过程创建和修改:http://www.cnblogs.com/sosoft/p/3535696.html
[4] SQL Server数值的转换: http://blog.csdn.net/studyzy/article/details/4491127
[5] SQLServer数值的插入与更新:http://www.cnblogs.com/sshoub/archive/2011/08/10/2133997.html
[6] SQLServer的PARTITIONBY的用法:http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html
[7] SQL存储过程的优缺点:http://blog.csdn.net/yancqit/article/details/52100336
[8] SQL存储过程如何用数组或者集合参数:http://bbs.csdn.net/topics/390775186
[9] SQL存储过程中的游标使用:http://www.cnblogs.com/tuyile006/p/5319117.html
说明:
- 感谢各位前辈真诚的奉献知识。
- 如有读到我总结知识的各位小伙伴,请纠正的我的错误,我会不间断的更新我的博文。