本文主要介绍一个sqlserver存储过程语法的例子,有需要的朋友可以参考一下。
存储过程是作为可执行对象存储在数据库中的一个或多个SQL命令。定义总是抽象的。存储过程实际上是一组可以完成某些操作的SQL语句,但是这组语句是放在数据库中的(这里只说SQL Server)。如果我们在ASP中创建存储过程并调用存储过程,就可以避免将SQL语句与ASP代码混在一起。这至少有三个好处:第一,大大提高了效率。存储过程本身的执行速度非常快,调用存储过程可以大大减少与数据库的交互次数。第二,提高安全性。如果ASP代码中混入SQL语句,一旦代码被攻破,也意味着库结构被攻破。第三,有利于SQL语句的重用。
在ASP中,存储过程一般由命令对象调用。根据不同的情况,本文还介绍了其他调用方法。为了便于说明,根据存储过程的输入输出,做了以下简单的分类:1。只返回单个记录集的存储过程假设有以下存储过程(本文的目的不是讲T-SQL语法,所以存储过程只给出代码不做说明):
复制代码如下:/* SP1 */创建过程DBO。从DBO开始SELECT *时获取用户列表。[用户信息]结束
上面的存储过程获取userinfo表中的所有记录,并返回一个记录集。通过命令对象调用此存储过程的ASP代码如下:
复制代码如下: * *通过命令对象调用存储过程* * DIM MyComm,MyRstSet MyComm=Server。CreateObject(ADODB。命令’)my comm。active connection=my constr my constr是数据库连接字符串MyComm。CommandText= GetUserList 指定的存储过程名称MyComm。“CommandType=4”指示这是一个存储过程MyComm。准备好的=真。需要预编译SQL命令,setmy rst=my comm . executeset my comm=nothing
存储过程获得的记录集被赋值给MyRst,然后,就可以对MyRst进行操作了。在上面的代码中,CommandType属性表示请求的类型,其值和描述如下:-1表示无法确定CommandText参数的类型。
1表示CommandText是常规命令类型2表示CommandText参数是现有的表名4表示CommandText参数是存储过程的名称。
还可以通过Connection对象或Recordset对象调用存储过程,如下所示:
复制代码如下:“* *通过连接对象调用存储过程**DIM MyConn,rst set my conn=server . createobject( adodb . Connection )my conn . openmy constr my constr是数据库连接字符串setmy rst=my conn . execute( get userlist ,0,4)”。最后一个参数的含义与CommandTypeSet MyConn=Nothing相同。
* *通过记录集对象调用存储过程* * dimmyrtsetfirst=server . createobject( adodb . Recordset )my rst . open get userlist ,myconstr,0,1,4 myconstr是数据库连接字符串,最后一个参数与CommandType含义相同。
2.对于没有输入和输出的存储过程,请参见以下存储过程:
复制代码如下:/* SP2 */创建过程DBO。从DBO开始删除。[用户信息]结束
这个存储过程删除userinfo表中的所有记录,没有任何输入和输出。调用方法与上面提到的基本相同,只是不需要记录集:
复制代码如下: * *通过命令对象调用存储过程* * dimmycomm set my comm=server . createobject( adodb . Command )my comm。active Connection=my constr my constr是数据库连接字符串MyComm。CommandText=delUserAll 指定的存储过程名称MyComm。“CommandType=4”指示这是一个存储过程MyComm。“Prepared=true”要求SQL命令预编译MyComm。这里不需要获取记录集。
设置MyComm=Nothing
当然,也可以通过Connection对象或recordset对象调用这种存储过程,但Recordset对象是为了获取Recordset而构建的。如果没有返回记录集,您仍然应该使用Command对象。
3.具有返回值的存储过程应充分利用SQL Server强大的事务处理功能,在执行类似SP2的操作时保持数据的一致性。此外,我们可能需要存储过程来返回执行状态,因此我们将修改SP2如下:
复制代码如下:/* SP3 */创建过程DBO。从DBO开始删除事务时,取消所有as设置的计数。[userinfo]IF @ @ error=0 begin COMMIT TRANSACTION返回1 end ELSE begin roll back TRANSACTION返回0 end返回end go
上述存储过程,当delete成功执行时,返回1,否则返回0,并回滚。为了在ASP中获得返回值,您需要使用Parameters集合来声明参数:
复制代码如下: * *用返回值调用存储过程,得到返回值* * DIM MyComm,MyPara Set MyComm=Server。CreateObject(ADODB。命令’)my comm。active connection=my constr my constr是数据库连接字符串MyComm。CommandText= delUserAll 指定存储过程名称MyComm。“CommandType=4 ”,这表明这是一个存储过程MyComm。Prepared=T. Rue 要求预先编译SQL命令声明返回值集my para=my comm . create parameter( return ,2,4)。
my comm . parameters . append my paramycomm . execute 以获取返回值DIM retValue retValue=MyComm(0)或retValue=my comm . parameters(0)set my comm=nothing。
在mycomm.createparameter (return ,2,4)中,每个参数的含义如下:第一个参数( retire )是参数名。参数名可以任意设置,但通常应该与存储过程中声明的参数名相同。这里是返回值,我以前设置为‘retire’;第二个参数(2)表示该参数的数据类型。对于具体的类型代码,请参考ADO参考。给出了以下常见类型代码:
复制代码如下:adBigInt:20;adBinary:128;ad boolean:11;adChar:129;adDBTimeStamp:135;ad empty:0;ad integer:3;adSmallInt:2;adTinyInt:16;adVarChar:200;
对于返回值,只能整形,-1到-99是保留值;第三个参数(4)表示参数的性质,其中4表示它是一个返回值。该参数的值描述如下:0:无法确定类型;1:输入参数;2:输入参数;3:输入或输出参数;4:返回值
上面给出的ASP代码应该说是完整的代码,也就是最复杂的代码。其实复制的代码如下:set my para=my comm . create parameter( return ,2,4)my comm parameters . append my para。
复制代码可以简化如下:my comm . parameters . appendmycomm . create parameter( return ,2,4)
甚至可以简化,后面会解释。对于带参数的存储过程,只能用Command对象调用(也有报道说可以用Connection对象或Recordset对象调用,但我没试过)。
4.带有输入参数和输出参数的存储过程的返回值实际上是一个特殊的输出参数。在大多数情况下,我们使用带有输入和输出参数的存储过程。例如,如果我们想获得用户信息表中一个ID为的用户的用户名,那么有一个输入参数——用户ID,和一个输出参数——用户名。实现该功能的存储过程如下:
复制代码如下:/* sp4 */createproceduredbo . get username @ userid int,@ username varchar(40)output as set no count on begin if @ userid为null return select @ username=username from dbo。[用户信息]