sqlserver存储过程语法详解


本文整理自网络,侵删。

存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个:
第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。
第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。
第三、有利于SQL语句的重用。

在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类:
1. 只返回单一记录集的存储过程
假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明):

代码如下:

/*SP1*/
    CREATE PROCEDURE dbo.getUserList
    as
    set nocount on
    begin
       select * from dbo.[userinfo]
    end
    go

以上存储过程取得userinfo表中的所有记录,返回一个记录集。通过command对象调用该存储过程的ASP代码如下:

代码如下:

'**通过Command对象调用存储过程**
DIM MyComm,MyRst
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr  'MyConStr是数据库连接字串
MyComm.CommandText  = "getUserList" '指定存储过程名
MyComm.CommandType  = 4 '表明这是一个存储过程
MyComm.Prepared = true  '要求将SQL命令先行编译
Set MyRst = MyComm.Execute
Set MyComm = Nothing

存储过程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。
在以上代码中,CommandType属性表明请求的类型,取值及说明如下:
-1   表明CommandText参数的类型无法确定

1表明CommandText是一般的命令类型
2表明CommandText参数是一个存在的表名称
4表明CommandText参数是一个存储过程的名称

还可以通过Connection对象或Recordset对象调用存储过程,方法分别如下:

代码如下:

'**通过Connection对象调用存储过程**
DIM MyConn,MyRst
Set MyConn = Server.CreateObject("ADODB.Connection")
MyConn.open MyConStr'MyConStr是数据库连接字串
Set MyRst  = MyConn.Execute("getUserList",0,4)  '最后一个参断含义同CommandType
Set MyConn = Nothing

'**通过Recordset对象调用存储过程**
DIM MyRst
Set MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList",MyConStr,0,1,4
'MyConStr是数据库连接字串,最后一个参断含义与CommandType相同

2. 没有输入输出的存储过程
请看以下存储过程:

代码如下:

/*SP2*/
CREATE PROCEDURE dbo.delUserAll
as
set nocount on
begin
delete from dbo.[userinfo]
end
go

该存储过程删去userinfo表中的所有记录,没有任何输入及输出,调用方法与上面讲过的基本相同,只是不用取得记录集:

代码如下:

'**通过Command对象调用存储过程**
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr  'MyConStr是数据库连接字串
MyComm.CommandText  = "delUserAll"  '指定存储过程名
MyComm.CommandType  = 4 '表明这是一个存储过程
MyComm.Prepared = true  '要求将SQL命令先行编译
MyComm.Execute  '此处不必再取得记录集

Set MyComm = Nothing

当然也可通过Connection对象或Recordset对象调用此类存储过程,不过建立Recordset对象是为了取得记录集,在没有返回记录集的情况下,还是利用Command对象吧。

3. 有返回值的存储过程
在进行类似SP2的操作时,应充分利用SQL Server强大的事务处理功能,以维护数据的一致性。并且,我们可能需要存储过程返回执行情况,为此,将SP2修改如下:

代码如下:

/*SP3*/
    CREATE PROCEDURE dbo.delUserAll
    as
    set nocount on
    begin
       BEGIN TRANSACTION
       delete from dbo.[userinfo]
       IF @@error=0
          begin
             COMMIT TRANSACTION
             return 1
          end
       ELSE
          begin
             ROLLBACK TRANSACTION
             return 0
          end       
       return
    end
    go

阅读剩余部分

相关阅读 >>

19个mysql性能优化要点解析

如何在sql server中重命名json密钥(t-sql)?

mybatis之动态sql标签的使用

asp经典入门教程 在asp中使用sql 语句第22页

sql更新记录的命令是什么

sql语句中修改表结构的命令是什么?

如何执行一条sql更新语句?

图文详解mysql中如何查看sql语句的执行时间

sql中datediff函数怎么用?(代码详解)

sql注入原理介绍

更多相关阅读请进入《sql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...