ms sql server 存储过程详解

SQL Server 存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。存储过程可以是永久的,也可以是临时的。

创建存储过程,使用 CREATE PROCEDURE 创建存储过程,也可以简写为 CREATE PROC,在本连载中我们一律使用简写。

最简单的语法
CREATE PROC 存储过程名称
AS
SQL语句

带参数的语法
CREATE PROC 存储过程名称 参数1 参数1类型, 参数2 参数2类型…参数n 参数n类型 OUTPUT
AS
SQL语句

如:
create proc usp_adddoc @title varchar(500), @content text, @docid int output
as
    insert into tbldocs(title, content) values(@title, @content)
    select @docid=scope_identity()

上述示例中,共有三个参数,第一、二为输入参数,第三个为输出参数,将数据插入到表后,将记录的 id 以 docid 返回。

删除存储过程:
DROP PROC 存储过程1, 存储过程2…

判断存储过程是否存在:
if Exists(select name from sysobjects where name=’存储过程名’ and type=’P’)
    –该存储过程存在

查看存储过程内容:
exec sp_helptext ‘存储过程名称’

存储过程命名:
过程名必须符合标识符规则,且对于数据库及其所有者必须唯一,注意不要以 sp_ 开头为存储过程命名,SQL Server 遇到 sp_ 开头的存储过程总是先在 master 数据库中查找,再查找用户指定的数据库或所有者,最后才以 dbo 作为所有者查找。

存储过程权限:
当在存储过程内创建临时对象时,它们由过程所有者而不是当前执行过程的用户所拥有。
如果同一用户拥有存储过程及其所引用的所有视图和表或者存储过程及其对象都在同一数据库中,SQL Server 就只检查过程上的权限。
权限会在存储过程间传递。

存储过程不能访问另一个存储过程建立的结果集。

存储过程的最大大小为 128 MB。

存储过程最多有 2100 个参数。

cursor 数据类型的参数只能传出,但不能被数据库 API 调用,如您想将 cursor 参数传出以便 ASP 程序使用,这是不正确的。

存储过程内部发生了异常,调用它的 API 不会发生运行时错误。

存储过程创建好后如何被 ASP 之类的程序调用呢,这一节说说这个问题。

第一种方法:利用 ADODB.Connection 对象的 Execute 方法,如:

conn.Execute “exec sp_executesql N'” & Replace(sql, “‘”, “””) & “‘”

第二种方法,利用 ADODB.Command 对象,这也是最常用的方法。

dim cmd
set cmd = server.CreateObject(“ADODB.Command”)
cmd.ActiveConnection = conn ‘conn 为 ADODB.Connection 对象
cmd.CommandText = “存储过程名”
cmd.CommandType = 4 ‘表示类型为存储过程

cmd.parameters.Append cmd.CreateParameter(“存储过程的参数名”, 参数类型, 参数方向, 参数长度, 参数值)
cmd.parameters.Append cmd.CreateParameter(“@docID”, 3, 2, 4) ‘这里只有四个参数,是因为 @docID 为输出(OUTPUT)参数,就省略了参数值
cmd.Execute

docID = cmd.parameters(“@docID”).value ‘获得存储过程的 OUTPUT 参数值
set cmd = nothing

存储过程的参数名:注意 @ 不能省略。
参数类型:用数字表示,int 类型为 3,smallint 类型为 2,tinyint 类型为 16,更多类型的值,会在下一节给出。
参数方向:用数字表示,1 为输入即参数值是传入存储过程的, 2 为输出即参数值是从存储过程中传出来的,如上面的 docID。
参数长度:如:int 长度为 4,smallint 长度为 2,tinyint 长度为 1,跟 SQL 中的长度差不多,要注意的是:ASP调用存储过程时操作text字段出错。
参数值:要传入存储过程的参数的值。

参数类型(常用):

adBoolean 11 (bit)

adTinyInt 16

adSmallInt 2

adInteger 3

adSingle 4

adDouble 5

adNumeric 131

adVarChar 200 (varchar)

adLongVarChar 201 (text)

adVarWChar 202 (nvarchar)

adLongVarWChar 203 (ntext)

adVarBinary 204

adLongVarBinary 205

adDateTime 135

adCurrency 6




coded by nessus
发表评论?

0 条评论。

发表评论