澳门新葡亰Sql 中存储过程详细案例。存储过程。




转自:http://www.cnblogs.com/yank/p/4235609.html

概念

积存过程(Stored
Procedure):已预编译为一个可实行进程的一个要么多独SQL语句。 

概念

储存过程(Stored
Procedure):已预编译为一个可是实施进程的一个还是多独SQL语句。 

始建存储过程语法

澳门新葡亰 1😉

CREATE proc | procedure procedure_name
    [{@参数数据类型} [=默认值] [output],
     {@参数数据类型} [=默认值] [output],
     ....
    ]
as
    SQL_statements go

澳门新葡亰 2😉

创立存储过程语法

澳门新葡亰 3

CREATE proc | procedure procedure_name
    [{@参数数据类型} [=默认值] [output],
     {@参数数据类型} [=默认值] [output],
     ....
    ]
as
    SQL_statements
go

澳门新葡亰 4

储存过程与SQL语句对比

优势:

1、提高性 SQL语句以创建进程不时进行剖析及编译。
存储过程是预编译的,在首坏运行一个储存过程不时,查询优化器对那进展辨析、优化,并让有最终给在网表中的囤计划,这样,在实施过程不时即便只是节省此开。
2、降低网络支付
存储过程调用时不过需要用提供仓储过程叫以及必备的参数信息,从而可落网络的流量。
3、便于进行代码移植
数据库专业人员可以随时对存储过程进展改动,但对应用程序源代码却毫不影响,从而极大的加强了次的可移植性。
4、更胜的安全性
1)系统管理员可以本着执行之之一一个囤过程进行权力限制,避免非授权用户指向数据的拜会
2)在经网调用过程时,只有对实行进程的调用是可见的。
因此,恶意用户无法见到表和数据库对象名称、嵌入自己的 Transact-SQL
语句或探寻关键数据。 3)使用过程参数有助于避免 SQL 注入攻击。
因为参数输入被看做文字值如果非可实施代码,所以,攻击者将命插入过程外之
Transact-SQL 语句并损害安全性将越加艰难。
4)可以对经过进行加密,这促进对源代码进行模糊处理。 

劣势:

1、存储过程要专门的数据库开发人员进行保护,但实在情况是,往往是因为程序开发员人员兼

2、设计逻辑变更,修改存储过程没SQL灵活

仓储过程及SQL语句对比

优势:

1、提高性
SQL语句以创建进程时进行解析以及编译。
存储过程是预编译的,在首赖运行一个储存过程不时,查询优化器对其开展剖析、优化,并受有最终让在系统表中的储存计划,这样,在推行进程时就只是节约此付出。
2、降低网络支出
囤过程调用时就待用提供仓储过程叫及必要之参数信息,从而可降低网络的流量。
3、便于进行代码移植
数据库专业人员好天天对存储过程进展修改,但针对应用程序源代码却毫不影响,从而极大的增强了序的可移植性。
4、更强之安全性
1)系统管理员可以对施行之某某一个囤过程进行权力限制,避免非授权用户指向数据的走访
2)在通过网调用过程时,只有对执行进程的调用是可见的。
因此,恶意用户无法见到表和数据库对象名称、嵌入自己的 Transact-SQL
语句或探寻关键数据。
3)使用过程参数有助于避免 SQL 注入攻击。
因为参数输入被当做文字值如果不可实施代码,所以,攻击者将命插入过程外的
Transact-SQL 语句并损害安全性将越艰难。
4)可以针对经过进展加密,这有助于对源代码进行模糊处理。 

劣势:

1、存储过程需要特地的数据库开发人员进行保障,但实则情形是,往往出于程序开发员人员兼

2、设计逻辑变更,修改存储过程没有SQL灵活

怎以事实上行使被,存储过程用到对立比较少吗?

以平凡的类型研发中,用存储过程却相对比较少,这是怎吧? 分析原因如下:
1)没有一定的数据库开发人员,普通程序员兼职进行数据库操作
2)程序员往往只需要操作程序,即可成功数据看,无需另行当数据库及进展开发
3)项目求变动比较累,修改SQL语句比较方便,特别是涉逻辑变更 

怎当骨子里使用被,存储过程用到对立较少呢?

当一般的类型研发中,用存储过程倒相对较少,这是怎也?
解析原因如下:
1)没有一定的数据库开发人员,普通程序员兼职进行数据库操作
2)程序员往往只是需要操作程序,即可完成多少访问,无需再次于数据库及进展付出
3)项目求变动比较累,修改SQL语句比较有利,特别是涉逻辑变更 

储存过程及SQL语句如何抉择?

因实际采用之更,给予如下建议:

1、在有胜似效率要规范性要求比大的色,建议采用储存过程
2、对于一般品种建议用参数化命令道,是储存过程以及SQL语句一栽折中的章程
3、对于有些算法要求比较高,涉及多条数逻辑,建议使用储存过程

 

存储过程以及SQL语句如何挑选?

据悉实际采用之经验,给予如下建议:

1、在一些大效率要规范性要求比大的品种,建议使用储存过程
2、对于一般品种建议采用参数化命令道,是储存过程和SQL语句一种植折中之主意
3、对于部分算法要求于强,涉及多长数据逻辑,建议使用储存过程

 

仓储过程的切实应用

 一、基础查询

1、创建不带参数的囤过程

事例:查询学生总数

澳门新葡亰 5😉

--查询存储过程
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_COUNT', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_COUNT
AS 
    SELECT COUNT(ID) FROM Students
GO

澳门新葡亰 6😉

执行:

EXEC PROC_SELECT_STUDENTS_COUNT

 

2、带参数的仓储过程

澳门新葡亰 7😉

--查询存储过程,根据城市查询总数
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_CITY_COUNT', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT(@city nvarchar(50))
AS
    SELECT COUNT(ID) FROM Students WHERE City=@city
GO

澳门新葡亰 8😉

尽语句:

EXEC PROC_SELECT_STUDENTS_BY_CITY_COUNT N'Beijing'

3、带有通配符

通配符,在参数值赋值时,加上相应的通配符

澳门新葡亰 9😉

--3、查询姓氏为李的学生信息,含通配符
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_SURNNAME', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_SURNNAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_SURNNAME
    @surnName nvarchar(20)='李%' --默认值
AS 
    SELECT ID,Name,Age FROM Students WHERE Name like @surnName
GO

澳门新葡亰 10😉

执行:

EXEC PROC_SELECT_STUDENTS_BY_SURNNAME
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'李%'
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'%李%'

 

4、带有输出参数

澳门新葡亰 11😉

--根据姓名查询的学生信息,返回学生的城市及年龄
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_NAME', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_NAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_NAME
    @name nvarchar(50),     --输入参数
    @city nvarchar(20) out, --输出参数
    @age  int output        --输入输出参数
AS 
    SELECT @city=City,@age=Age FROM Students WHERE Name=@name AND Age=@age
GO

澳门新葡亰 12😉

执行:

澳门新葡亰 13😉

--执行
declare @name nvarchar(50),
        @city nvarchar(20),
        @age int;
set @name = N'李明';
set @age = 20;
exec PROC_SELECT_STUDENTS_BY_NAME @name,@city out, @age output;
select @city, @age;

澳门新葡亰 14😉

仲、使用存储过程进行加删改

1、新增

增产学生信息 

澳门新葡亰 15😉

--1、存储过程:新增学生信息
IF OBJECT_ID (N'PROC_INSERT_STUDENT', N'P') IS NOT NULL
    DROP procedure PROC_INSERT_STUDENT;
GO
CREATE procedure PROC_INSERT_STUDENT
    @id int,
    @name nvarchar(20),
    @age int,
    @city nvarchar(20)
AS 
    INSERT INTO Students(ID,Name,Age,City) VALUES(@id,@name,@age,@city)
GO

澳门新葡亰 16😉

 执行:

EXEC PROC_INSERT_STUDENT 1001,N'张三',19,'ShangHai'

2、修改

因学生ID,更新学生信息 

澳门新葡亰 17😉

IF OBJECT_ID (N'PROC_UPDATE_STUDENT', N'P') IS NOT NULL
    DROP procedure PROC_UPDATE_STUDENT;
GO
CREATE procedure PROC_UPDATE_STUDENT
    @id int,
    @name nvarchar(20),
    @age int,
    @city nvarchar(20)
AS 
    UPDATE Students SET Name=@name,Age=@age,City=@city WHERE ID=@id
GO

澳门新葡亰 18😉

执行:

EXEC PROC_UPDATE_STUDENT 1001,N'张思',20,'ShangHai'

 

3、删除

据悉ID,删除某学生记录

澳门新葡亰 19😉

--3、存储过程:删除学生信息
IF OBJECT_ID (N'PROC_DELETE_STUDENT_BY_ID', N'P') IS NOT NULL
    DROP procedure PROC_DELETE_STUDENT_BY_ID;
GO
CREATE procedure PROC_DELETE_STUDENT_BY_ID
    @id int
AS 
    DELETE FROM  Students WHERE ID=@id
GO

澳门新葡亰 20😉

执行:

EXEC PROC_DELETE_STUDENT_BY_ID 1001

 

 三、存储过程实现分页查询

1、使用row_number函数分页

澳门新葡亰 21😉

--分页查询
IF OBJECT_ID (N'PROC_SELECT_BY_PAGE', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_BY_PAGE;
GO
CREATE procedure PROC_SELECT_BY_PAGE
    @startIndex int,
    @endIndex int
AS 
    SELECT  * FROM (SELECT ID,Name,Age,City,ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNumber FROM Students) AS Temp 
    WHERE Temp.RowNumber BETWEEN @startIndex AND @endIndex
GO

澳门新葡亰 22😉

执行:

EXEC PROC_SELECT_BY_PAGE 1,10

2、使用传统的top分页

澳门新葡亰 23😉

--使用TOP分页
IF OBJECT_ID (N'PROC_SELECT_BY_PAGE_WITH_TOP', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_BY_PAGE_WITH_TOP;
GO
CREATE procedure PROC_SELECT_BY_PAGE_WITH_TOP
    @pageIndex int,
    @pageSize int
AS 
    SELECT TOP(@pageSize) * FROM Students 
    WHERE ID >=(SELECT MAX(ID) FROM (SELECT TOP(@pageSize*(@pageIndex-1) + 1) ID FROM Students ORDER BY ID) AS Temp)    
GO

澳门新葡亰 24😉

执行:

EXEC PROC_SELECT_BY_PAGE_WITH_TOP 1,2

 

季、其他力量:

1、存储过程,每次执行还进展重复编译

澳门新葡亰 25😉

--1、存储过程,重复编译
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_WITH_RECOMPILE', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_WITH_RECOMPILE;
GO
CREATE procedure PROC_SELECT_STUDENTS_WITH_RECOMPILE
with recompile --重复编译
AS 
    SELECT * FROM Students
GO

澳门新葡亰 26😉

 

2、对存储过程进展加密

加密后,不能够查和修改源脚本

澳门新葡亰 27😉

--2、查询存储过程,进行加密
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_WITH_ENCRYPTION', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_WITH_ENCRYPTION;
GO
CREATE procedure PROC_SELECT_STUDENTS_WITH_ENCRYPTION
with encryption --加密
AS 
    SELECT * FROM Students
GO

澳门新葡亰 28😉

执行:

EXEC PROC_SELECT_STUDENTS_WITH_ENCRYPTION

效益,无法查看脚本或者导出创建脚本

澳门新葡亰 29

 

储存过程的切切实实运用

 一、基础查询

1、创建不带来参数的积存过程

事例:查询学生总数

澳门新葡亰 30

--查询存储过程
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_COUNT', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_COUNT
AS 
    SELECT COUNT(ID) FROM Students
GO

澳门新葡亰 31

执行:

EXEC PROC_SELECT_STUDENTS_COUNT

 

2、带参数的囤积过程

澳门新葡亰 32

--查询存储过程,根据城市查询总数
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_CITY_COUNT', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT(@city nvarchar(50))
AS
    SELECT COUNT(ID) FROM Students WHERE City=@city
GO

澳门新葡亰 33

实行语句:

EXEC PROC_SELECT_STUDENTS_BY_CITY_COUNT N'Beijing'

3、带有通配符

通配符,在参数值赋值时,加上相应的通配符

澳门新葡亰 34

--3、查询姓氏为李的学生信息,含通配符
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_SURNNAME', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_SURNNAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_SURNNAME
    @surnName nvarchar(20)='李%' --默认值
AS 
    SELECT ID,Name,Age FROM Students WHERE Name like @surnName
GO

澳门新葡亰 35

执行:

EXEC PROC_SELECT_STUDENTS_BY_SURNNAME
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'李%'
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'%李%'

 

4、带有输出参数

澳门新葡亰 36

--根据姓名查询的学生信息,返回学生的城市及年龄
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_NAME', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_NAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_NAME
    @name nvarchar(50),     --输入参数
    @city nvarchar(20) out, --输出参数
    @age  int output        --输入输出参数
AS 
    SELECT @city=City,@age=Age FROM Students WHERE Name=@name AND Age=@age
GO

澳门新葡亰 37

执行:

澳门新葡亰 38

--执行
declare @name nvarchar(50),
        @city nvarchar(20),
        @age int;
set @name = N'李明';
set @age = 20;
exec PROC_SELECT_STUDENTS_BY_NAME @name,@city out, @age output;
select @city, @age;

澳门新葡亰 39

第二、使用存储过程进行多删改

1、新增

增产学生信息 

澳门新葡亰 40

--1、存储过程:新增学生信息
IF OBJECT_ID (N'PROC_INSERT_STUDENT', N'P') IS NOT NULL
    DROP procedure PROC_INSERT_STUDENT;
GO
CREATE procedure PROC_INSERT_STUDENT
    @id int,
    @name nvarchar(20),
    @age int,
    @city nvarchar(20)
AS 
    INSERT INTO Students(ID,Name,Age,City) VALUES(@id,@name,@age,@city)
GO

澳门新葡亰 41

 执行:

EXEC PROC_INSERT_STUDENT 1001,N'张三',19,'ShangHai'

2、修改

基于学生ID,更新学生信息 

澳门新葡亰 42

IF OBJECT_ID (N'PROC_UPDATE_STUDENT', N'P') IS NOT NULL
    DROP procedure PROC_UPDATE_STUDENT;
GO
CREATE procedure PROC_UPDATE_STUDENT
    @id int,
    @name nvarchar(20),
    @age int,
    @city nvarchar(20)
AS 
    UPDATE Students SET Name=@name,Age=@age,City=@city WHERE ID=@id
GO

澳门新葡亰 43

执行:

EXEC PROC_UPDATE_STUDENT 1001,N'张思',20,'ShangHai'

 

3、删除

因ID,删除某学生记录

澳门新葡亰 44

--3、存储过程:删除学生信息
IF OBJECT_ID (N'PROC_DELETE_STUDENT_BY_ID', N'P') IS NOT NULL
    DROP procedure PROC_DELETE_STUDENT_BY_ID;
GO
CREATE procedure PROC_DELETE_STUDENT_BY_ID
    @id int
AS 
    DELETE FROM  Students WHERE ID=@id
GO

澳门新葡亰 45

执行:

EXEC PROC_DELETE_STUDENT_BY_ID 1001

 

 三、存储过程实现分页查询

1、使用row_number函数分页

澳门新葡亰 46

--分页查询
IF OBJECT_ID (N'PROC_SELECT_BY_PAGE', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_BY_PAGE;
GO
CREATE procedure PROC_SELECT_BY_PAGE
    @startIndex int,
    @endIndex int
AS 
    SELECT  * FROM (SELECT ID,Name,Age,City,ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNumber FROM Students) AS Temp 
    WHERE Temp.RowNumber BETWEEN @startIndex AND @endIndex
GO

澳门新葡亰 47

执行:

EXEC PROC_SELECT_BY_PAGE 1,10

2、使用传统的top分页

澳门新葡亰 48

--使用TOP分页
IF OBJECT_ID (N'PROC_SELECT_BY_PAGE_WITH_TOP', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_BY_PAGE_WITH_TOP;
GO
CREATE procedure PROC_SELECT_BY_PAGE_WITH_TOP
    @pageIndex int,
    @pageSize int
AS 
    SELECT TOP(@pageSize) * FROM Students 
    WHERE ID >=(SELECT MAX(ID) FROM (SELECT TOP(@pageSize*(@pageIndex-1) + 1) ID FROM Students ORDER BY ID) AS Temp)    
GO

澳门新葡亰 49

执行:

EXEC PROC_SELECT_BY_PAGE_WITH_TOP 1,2

 

季、其他职能:

1、存储过程,每次执行还进行重新编译

澳门新葡亰 50

--1、存储过程,重复编译
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_WITH_RECOMPILE', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_WITH_RECOMPILE;
GO
CREATE procedure PROC_SELECT_STUDENTS_WITH_RECOMPILE
with recompile --重复编译
AS 
    SELECT * FROM Students
GO

澳门新葡亰 51

 

2、对存储过程进行加密

加密后,不可知查和修改源脚本

澳门新葡亰 52

--2、查询存储过程,进行加密
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_WITH_ENCRYPTION', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_WITH_ENCRYPTION;
GO
CREATE procedure PROC_SELECT_STUDENTS_WITH_ENCRYPTION
with encryption --加密
AS 
    SELECT * FROM Students
GO

澳门新葡亰 53

执行:

EXEC PROC_SELECT_STUDENTS_WITH_ENCRYPTION

效益,无法查看脚本或者导出创建脚本

澳门新葡亰 54

 

作者介绍:半路学IT,做开发3年,先下车于相同贱共享单车店,做后台开发!

 我起了一个公众号,欢迎各位有志同道合朋友,关注!不期分享工作,和自我得故事!

澳门新葡亰 55

分类: 数据库技术

相关文章

Leave a Comment.