SQL Server的存储过程

38次阅读
没有评论

共计 5716 个字符,预计需要花费 15 分钟才能阅读完成。

本篇内容主要讲解“SQL Server 的存储过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“SQL Server 的存储过程”吧!

首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用 SQL 语句写好并用一个指定的名称存储起来,并且这样的语句是放在中的,还可以根据条件执行不同 SQL 语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用 execute, 即可自动完成命令。

语法:
 
Sql 代码  
CREATE PROC [EDURE] procedure_name [; number] 
  [{ @parameter data_type} 
  [VARYING] [= default] [OUTPUT] 
  ] [,…n] 
 
[WITH 
  {RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION} ] 
 
[FOR REPLICATION] 
 
AS sql_statement […n] 
 
——————————————————————————- 
 
create proc [edure] procedure_name [;number] 
 
  [{@parameter date_type} 
 
  [varying] [=default] [output] 
 
  ] [,…n] 
 
  [with {recompile | encryption | recompile , encryption}] 
 
  [for repilcation] 
 
  as sql_statement [..n] 
  参数:
procedure_name
新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。
要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。
;number
是可选的整数,用来对同 名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。
@parameter
过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2100 个参数。
使用 @符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。
data_type
参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。
  说明:对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。
  VARYING
指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。
default
参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT
表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。
n
表示最多可以指定 2100 个参数的占位符。
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。
ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。
  说明:在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。
FOR REPLICATION
指定不能在订阅服务器上执行为复制创建的存储过程。. 使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。
AS
指定过程要执行的操作。
sql_statement
过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。
n
是表示此过程可以包含多条 Transact-SQL 语句的占位符。
注释
存储过程的最大大小为 128 MB。
 
 
存储过程的优点都有哪些呢?
1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的 SQL 语句每执行一次就编译一次, 所以使用存储过程可提高数据库执行速度。
2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用 SP 来封装数据库操作。当对数据库进行复杂操作时 (如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可以极大的提高数据 库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。在代码上看,SQL 语句和程序代码语句的分离,可以提高程序代码的 可读性。
3. 存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。
4. 安全性高, 可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:
(1)系统存储过程:以 sp_开头, 用来进行系统的各项设定. 取得信息. 相关管理工作, 如 sp_help 就是取得指定对象的相关信息。
(2)扩展存储过程 以 XP_开头, 用来调用操作系统提供的功能
exec master..xp_cmdshell ping 10.8.16.1
(3)用户自定义的存储过程, 这是我们所指的存储过程常用格式
模版:Create procedure procedue_name [@parameter data_type][output]
[with]{recompile|encryption} as sql_statement
解释:output:表示此参数是可传回的
with {recompile|encryption} recompile: 表示每次执行此存储过程时都重新编译一次;encryption: 所创建的存储过程的内容会被加密。
 
实例 1:只返回单一记录集的存储过程。
表银行存款表(bankMoney)的内容如下
 

要求 1:查询表 bankMoney 的内容的存储过程
 
Sql 代码  
create procedure sp_query_bankMoney 
as 
select * from bankMoney 
go 
exec sp_query_bankMoney 
  注 *  在使用过程中只需要把中的 SQL 语句替换为存储过程名,就可以了很方便吧!
 
实例 2(向存储过程中传递参数):
加入一笔记录到表 bankMoney,并查询此表中 userID= Zhangsan 的所有存款的总金额。
Sql 代码  
Create proc insert_bank 
@param1 char(10), 
@param2 varchar(20), 
@param3 varchar(20), 
@param4 int, 
@param5 int output 
with encryption ——— 加密  
as 
insert bankMoney (id,userID,sex,Money) 
Values(@param1,@param2,@param3, @param4) 
select @param5=sum(Money) from bankMoney where userID= Zhangsan  
go 
  在 SQL Server 查询分析器中执行该存储过程的方法是:
Sql 代码  
declare @total_price int 
exec insert_bank 004 , Zhangsan , 男 ,100,@total_price output 
print 总余额为 +convert(varchar,@total_price) 
go 
 
在这里再啰嗦一下存储过程的 3 种传回值(方便正在看这个例子的朋友不用再去查看语法内容):
1. 以 Return 传回整数
2. 以 output 格式传回参数
3.Recordset
传回值的区别:
output 和 return 都可在批次程式中用变量接收, 而 recordset 则传回到执行批次的客户端中
 
实例 3:使用带有复杂 SELECT 语句的简单过程
下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。
Sql 代码  
USE pubs 
IF EXISTS (SELECT name FROM sysobjects 
  WHERE name = au_info_all AND type = P ) 
  DROP PROCEDURE au_info_all 
GO 
CREATE PROCEDURE au_info_all 
AS 
SELECT au_lname, au_fname, title, pub_name 
  FROM authors a INNER JOIN titleauthor ta 
  ON a.au_id = ta.au_id INNER JOIN titles t 
  ON t.title_id = ta.title_id INNER JOIN publishers p 
  ON t.pub_id = p.pub_id 
GO 
 au_info_all 存储过程可以通过以下方法执行:
EXECUTE au_info_all
— Or
EXEC au_info_all
如果该过程是批处理中的第一条语句,则可使用:
au_info_all
 
实例 4:使用带有参数的简单过程
Sql 代码  
CREATE PROCEDURE au_info 
  @lastname varchar(40), 
  @firstname varchar(20) 
AS 
SELECT au_lname, au_fname, title, pub_name 
  FROM authors a INNER JOIN titleauthor ta 
  ON a.au_id = ta.au_id INNER JOIN titles t 
  ON t.title_id = ta.title_id INNER JOIN publishers p 
  ON t.pub_id = p.pub_id 
  WHERE  au_fname = @firstname 
  AND au_lname = @lastname 
GO 
  au_info 存储过程可以通过以下方法执行:
Sql 代码  
EXECUTE au_info Dull , Ann  
— Or 
EXECUTE au_info @lastname = Dull , @firstname = Ann  
— Or 
EXECUTE au_info @firstname = Ann , @lastname = Dull  
— Or 
EXEC au_info Dull , Ann  
— Or 
EXEC au_info @lastname = Dull , @firstname = Ann  
— Or 
EXEC au_info @firstname = Ann , @lastname = Dull  
  如果该过程是批处理中的第一条语句,则可使用:
Sql 代码  
au_info Dull , Ann  
— Or 
au_info @lastname = Dull , @firstname = Ann  
— Or 
au_info @firstname = Ann , @lastname = Dull  
  实例 5:使用带有通配符参数的简单过程
Sql 代码  
CREATE PROCEDURE au_info2 
@lastname varchar(30) = D% , 
@firstname varchar(18) = %  
AS 
SELECT au_lname, au_fname, title, pub_name 
FROM authors a INNER JOIN titleauthor ta 
  ON a.au_id = ta.au_id INNER JOIN titles t 
  ON t.title_id = ta.title_id INNER JOIN publishers p 
  ON t.pub_id = p.pub_id 
WHERE au_fname LIKE @firstname 
  AND au_lname LIKE @lastname 
GO 
 au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:
Sql 代码  
EXECUTE au_info2 
— Or 
EXECUTE au_info2 Wh%  
— Or 
EXECUTE au_info2 @firstname = A%  
— Or 
EXECUTE au_info2 [CK]ars[OE]n  
— Or 
EXECUTE au_info2 Hunter , Sheryl  
— Or 
EXECUTE au_info2 H% , S%  
 
= proc2  

到此,相信大家对“SQL Server 的存储过程”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计5716字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)