sql语句执行的时候要先编译,然后执行。存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
[编辑本段]一、存储过程介绍
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE中,若干个有联系的过程可以组合在一起构成程序包。
存储过程是利用SQL Server所提供的Transact-SQL语言所编写的程序。Transact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面。它好比Oracle数据库系统中的Pro-SQL和Informix的数据库系统能够中的Informix- 4GL语言一样。这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:
1)、变量说明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程控制命令(if…else…、while….)
4)、内部函数
[编辑本段]二、使用存储过程有以下的优点:
* 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。
* 可保证数据的安全性和完整性。
# 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
# 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
* 在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
* 可以降低网络的通信量。
* 使体现企业规则的运算程序放入数据库服务器中,以便:
# 集中控制。
# 当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
[编辑本段]三、存储过程的种类:
1)、系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,
如 sp_help就是取得指定对象的相关信息
2)、扩展存储过程以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3)、用户自定义的存储过程,这是我们所指的存储过程
[编辑本段]四、存储过程的书写格式:
CREATE PROCEDURE [拥有者.]存储过程名[;程序编号]
[(参数#1,…参数#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数
(SQL Server 7.0以上版本),参数的使用方法如下:
@参数名 数据类型 [VARYING] [=内定值] [OUTPUT]
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
[=内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数,同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。
例子:
CREATE PROCEDURE order_tot_amt @o_id int,@p_tot int output AS
SELECT @p_tot = sum(Unitprice*Quantity)
FROM orderdetails
WHERE ordered=@o_id
例子说明:
该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的定单ID号码(@o_id),由定单明细表 (orderdetails)中计算该定单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序。
[编辑本段]五、存储过程的常用格式:
Create procedure procedue_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
如:
表book的内容如下
编号 书名 价格
001 C语言入门 $30
002 PowerBuilder报表开发 $52
实例1:查询表Book的内容的存储过程
create proc query_book
as
select * from book
go
exec query_book
实例2:
加入一笔记录到表book,并查询此表中所有书籍的总金额
Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as
insert book(编号,书名,价格) Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go
执行例子:
declare @total_price money
exec insert_book '003','Delphi 控件开发指南',$100,@total_price
print '总金额为'+convert(varchar,@total_price)
go
存储过程的3种传回值:
1)、以Return传回整数
2)、以output格式传回参数
3)、Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:
设有两个表为Product,Order_,其表内容如下:
Product
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order_
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Product a inner join Order_ b on a.产品编号=b.产品编号
if @@error=0
print 'Good'
else
&n bsp; print 'Fail'
go
[编辑本段]六、编写对数据库访问的存储过程:
数据库存储过程的实质就是部署在数据库端的一组定义代码以及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]
[ ]内的内容是可选项,而()内的内容是必选项,
例:若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为:
Create Proc select_del As
Delete tmp
例:用户想查询tmp表中某年的数据的存储过程
create proc select_query @year int as
select * from tmp where year=@year
在这里@year是存储过程的参数
例:该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。
空:表示该结点为顶层结点
fjdid(父结点编号)
结点n 非空:表示该结点的父亲结点号
dwmc(单位名称)
CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output
as
declare @stop int
declare @result varchar(80)
declare @dwmc varchar(80)
declare @dwid int
set nocount on
set @stop=1
set @dwmc=""
select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold
set @result=rtrim(@dwmc)
if @dwid=0
set @stop=0
while (@stop=1) and (@dwid<>0)
begin
set @dwidold=@dwid
select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold
if @@rowcount=0
set @dwmc=""
else
set @result=@dwmc+@result
if (@dwid=0) or (@@rowcount=0)
set @stop=0
else
continue
end
set @dwmcresult=rtrim(@result)
使用exec pro-name [pram1 pram2.....]
[编辑本段]七、在SQL Server中执行存储过程:
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。
在SQL Server的查询分析器中,输入以下代码:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出定单编号为1的定单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果。
存储过程具有以下特点:
1.具有立即访问数据库的能力;
2.是数据库服务器端的执行代码,在服务器执行操作时,减少网络通讯,提高执行效率。
3.保证数据库安全,自动完成提前设定的作业。
[编辑本段]八、存储过程的缺点
1:调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4: 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的。维护起来更加麻烦!
[编辑本段]九、存储过程中临时表的创建问题
(针对SQL2000/2OO5)
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。
本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。
SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)
如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。
除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
所有其它本地临时表在当前会话结束时自动除去。
全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。
分享到:
相关推荐
SQL存储过程试题及答案 SQL存储过程是数据库中的一种程序单元,能够完成特定的数据库操作。今天,我们将讨论三道关于SQL存储过程的试题,这些试题涵盖了存储过程的创建、调用和参数传递等方面。 1. 创建分数存储...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名并保存,然后在需要的时候调用,极大地提高了SQL代码的重用性和执行效率。在这个实例中,我们看到一个名为`Sum_wage`的存储过程,它的...
### SQL存储过程发送HTTP请求知识点解析 在数据库管理和应用程序开发中,经常需要实现数据库与外部系统之间的交互。其中一种常见的需求就是从SQL Server中的存储过程发起HTTP请求来获取或发送数据。这种技术不仅...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集合,它们被预先编译并存储在数据库中,可以通过一个名称来调用执行。学习SQL存储过程是提升数据库管理和应用开发效率的关键步骤,它可以帮助我们更好...
在Delphi中调用SQL存储过程并获取结果是数据库编程中的一个重要环节。下面将通过给定的代码示例,详细解析Delphi如何调用SQL存储过程,并获取执行结果。 ### Delphi调用SQL存储过程的基本步骤 #### 1. 准备工作 ...
### 使用SQL存储过程发送邮件 在数据库管理与应用开发中,常常需要利用SQL存储过程来实现复杂的业务逻辑或数据处理任务。本篇文章将详细介绍如何利用SQL Server中的存储过程实现发送邮件的功能,这对于需要进行自动...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集合,它们被编译并存储在数据库中,用户可以通过调用这个存储过程来执行预定义的任务,而不是每次需要时都编写相同的SQL代码。这个“sql存储过程帮助...
SQL存储过程详解 SQL存储过程是数据库管理系统中的一种重要组件,它是一组为了完成特定功能的 SQL 语句,集经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数来执行它。本文将对 SQL存储过程进行详细...
原创sql存储过程函数范例,一是为了自己方便查找,今天到公司因为没有我保存的一些范例,一个简单的例子写了半个小时,如果有范例直接套几分钟肯定搞定,所以索性上传到CSDN上,何时何地都能找到我的范例了。...
### SQL存储过程格式详解 SQL存储过程是一种预编译的SQL语句集合,可以在数据库中创建并保存,供外部程序调用。它们提供了一种封装和重用代码的方法,可以包含复杂的逻辑流程控制,如循环、条件判断等,从而增强...
以下将详细讲解如何在SQL存储过程中处理参数数组。 1. **使用Table-Valued Parameters (TVP)** TVP是SQL Server 2008引入的一种特性,它允许我们传递一个表格结构的数据作为参数。首先,我们需要定义一个用户定义...
### SQL存储过程的调用详解 #### 一、SQL存储过程概述 存储过程是一组预编译的SQL语句集合,存储在SQL服务器内部。它能够接收输入参数,并通过输出参数返回信息,用户可以通过调用存储过程来实现对数据库的操作。 ...
SQL存储过程是数据库管理系统中的一种重要工具,它允许程序员和数据库管理员预先定义并存储一系列复杂的SQL语句,以便后续调用。存储过程不仅能够提高数据处理的效率,还能增强数据库的安全性和可维护性。以下是对...
SQL存储过程和触发器是数据库管理系统中用于实现特定功能的重要工具,主要应用于SQL Server 2000等数据库系统。 存储过程(Stored Procedure)是一组预先编译的SQL语句集合,它们被存储在数据库中,可以被多次调用...
本文将重点介绍如何在SQL Server 2008环境中轻松编写T-SQL存储过程,并通过具体的示例来展示其实现方法。 #### 二、SQL Server Management Studio (SSMS) 在SQL Server 2008中,SQL Server Management Studio ...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集合,它们被编译并存储在数据库中,可以被多次调用,提高了代码的复用性和执行效率。本篇文章将深入探讨SQL存储过程的学习与实例,以帮助你更好地理解...
标题与描述解析:“SQL存储过程解密”与“SQL Server加密存储过程解密,很好用。”这两句话共同指向了一个在IT领域尤其是数据库管理中的重要概念——如何解密SQL Server中的加密存储过程。在数据库管理系统(DBMS)...
在SQL数据库管理中,自动执行SQL语句和创建标准的SQL存储过程是两个重要的操作,它们对于数据库管理和数据处理有着深远的影响。以下是这两个主题的详细解释: 首先,自动执行SQL语句是指通过一定的机制,让预定义的...