SqlServer存储过程及ASP中存储过程的调用

[color=Blue]存储过程的建立[/color]

  这里只简单介绍如何在Sql Server的企业管理器中如何建立存储过程:

(1)打开企业管理器Enterprise manager
(2)找到相应的服务器,展开要建立存储过程的数据库(Database),鼠标右击此数据库下的存储过程(Stored Procdures)项,在弹出的菜单中选择新建存储过程(New Stored Procedure),在弹出的存储过程属性(Stored Procedures Properties)选项框中输入建立存储过程的语句。下面是一个例子:
Create PROCEDURE procedureName
@mycola Char(10),@mycolb Char(10),@mycolc text
AS
  Insert into chatdata (mycola,mycolb,mycolc) values(@mycola,@mycolb,@mycolc)

  如果你对Sql语法不熟悉,可以使用Check Syntax来检查语法。在上例中,表示建立存储过程名为mycola,带3个参数的存储过过程,其中第一个参数mycola数据类型为char,宽度10;第2个参数数据类型为char,宽度为10,第3个参数数据类型为text,在这里使用的是Sql Server的数据类型。

Sql Server的文档中关于存储过程的语法
Create PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,…n ]

[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

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 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。

使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。

data_type
参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。

说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。

VARYING
指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。

default
参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。

OUTPUT
表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。

n
表示最多可以指定 2.100 个参数的占位符。

{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 语句的占位符。

[color=Blue]ASP中存储过程的调用方式集锦[/color]

[color=Red]以下说明都是在已经打开数据库连接conn的前提下[/color]

1,调用没有参数的存储过程
set cmd=server.CreateObject(“adodb.command”)
set cmd.ActiveConnection=conn
cmd.CommandText=”{call nono}”
'set rs=cmc.exe 或者cmd.execute
set rs=cmd.Execute()

2,带输入的参数的存储过程
set cmd=server.CreateObject(“adodb.command”)
set cmd.ActiveConnection=conn
cmd.CommandText=”{call oneinput(?)}”
cmd.Parameters.Append cmd.CreateParameter(“@aaa”,adInteger ,adParamInput )
cmd(“@aaa”)=100
cmd.Execute()

简单方法:
Conn.Execute “exec sp_AddHit 'http://www.aspalliance.com', 1”
请注意分割参数,该方法也不返回记录
有返回记录集:
rs.Open “Exec procname varValue1, varValue2”,conn

另一种返回记录集的方法:
set Cmd=Server.CreateObject(“ADODB.command”)
set Cmd.activeconnection=conn
Cmd.commandtype=4
Cmd.commandtext=”sp_1″ 'SP 名
Cmd.parameters(1)=… '参数值
Cmd.parameters(2)=…
set recordset1=Cmd.execute()

3,带输入参数和输出参数

要得到返回值,需要用Command的方法。
返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那样;另一种是可以返回多个值,存储这些值的变量名称需要在调用参数中先行指定。

这个例子要处理多种参数,输入参数,输出参数,返回记录集以及一个直接返回值(够全了吧?)
存储过程如下:

create procedure sp_PubsTest
— 定义三个参数变量,注意第三个,特别标记是用于输出
@au_lname varchar (20),
@intID int,
@intIDOut int OUTPUT

AS

Select @intIDOut = @intID + 1
Select * FROM authors Where au_lname LIKE @au_lname + ''%''

–直接返回一个值
RETURN @intID + 2

调用方法:
'定义一些参数
iVal = 5
oVal = 3
set Cmd = Server.CreateObject(“ADODB.Command”)
set cmd.ActiveConnection=conn

'定义command 对象调用名称
Cmd.CommandText = “sp_PubsTest”

'设置command调用类型是存储过程 (adCmdSPStoredProc = 4)
Cmd.CommandType = adCmdSPStoredProc

'往command 对象中加参数
'定义存储过程有直接返回值,并且是个整数,省缺值是4
Cmd.Parameters.Append Cmd.CreateParameter(“RETURN_VALUE”, adInteger, adParamReturnValue, 4)
'定义一个字符型输入参数
Cmd.Parameters.Append Cmd.CreateParameter(“@au_lname”, adVarChar, adParaminput, 20, “M”)
'定义一个整型输入参数
Cmd.Parameters.Append Cmd.CreateParameter(“@intID”, adInteger, adParamInput, iVal)
'定义一个整型输出参数
Cmd.Parameters.Append Cmd.CreateParameter(“@intIDOut”, adInteger, adParamOutput, oVal)

'运行存储过程,并得到返回记录集
Set adoRS = Cmd.Execute

'两个输出值
Response.Write “

@intIDOut = ” & Cmd.Parameters(“@intIDOut”).Value & “


Response.Write “

Return value = ” & Cmd.Parameters(“RETURN_VALUE”).Value & “

set cmd.ActiveConnection=conn
cmd.CommandText = “{call oneinout(?,?)}”
cmd.Parameters.Append cmd.CreateParameter(“@aaa”,adInteger,adParamInput)
cmd(“@aaa”)=10
cmd.Parameters.Append cmd.CreateParameter(“@bbb”,adInteger,adParamOutput)
cmd.Execute()
bbb=cmd(“@bbb”)

增加参数的语句格式为:

p.Append cm.CreateParameter(“参数名称”,类型,方向,大小)

参许参数值的类型的意义如下:

名称值 整数值 功能

adDBTimeStamp 135 日期时间数据类型
adDecimal 14 十进制整数值
adDouble 5 双精度小数值
adError 10 系统错误信息
AdGUID 72 全域性唯一识别字(Globally unique identifier)
adDispath 9 COM/OLE自动对象(Automation Object)
adInteger 3 4字节有符号整数
adIUnknown 13 COM/OLE对象
adLongVarBinary 205 大型2字节值
adLongVarChar 201 大型字符串值
adLongVarWChar 203 大型未编码字符串
adNumeric 131 十进制整数值
adSingle 4 单精度浮点小数
adSmallInt 2 2字节有符号整数
adTinyInt 16 1字节有符号整数
adUnsignedBigInt 21 8字节无符号整数
adUnsignedInt 19 4字节无符号整数
adUnsignedSmallInt 18 2字节无符号整数
adUnsignedTinyInt 17 1字节无符号整数
adUserDefined 132 用户自定义数据类型
adVariant 12 OLE对象
adVarBinary 204 双字节字符变量值
adVarChar 200 字符变量值
advarchar 202 未编码字符串变量值
adWchar 130 未编码字符串

方向值的意义如下:

名称值 整数值 功能

adParamInput 1 允许数据输入至该参数当中
adParamOutput 2 允许数据输出至该参数当中
adParamInputOutput 3 允许数据输入、输出至该参数当中
adparamReturnValue 4 允许从一子程序中返回数据至该参数当中

此调用方法可以直接写整数值,也可以包含adovbs.inc(此文件中已经定义好相应常数)然后写名称

4,一个输入参数,一个输出参数,和一个返回值
set cmd.ActiveConnection=conn
cmd.CommandText=”{?=call onereturn(?,?)}”
cmd.Parameters.Append cmd.CreateParameter(“@return_value”,adInteger,adParamReturnValue )
cmd.Parameters.Append cmd.CreateParameter(“@aaa”,adInteger,adParamInput )
cmd(“@aaa”)=10
cmd.Parameters.Append cmd.CreateParameter(“@bbb”,adInteger,adParamOutput)
cmd.Execute()

bbb=cmd(“@bbb”)
rrr=cmd(“@return_value”)

SqlServer中用SQL语句附加数据库及修改数据库逻辑文件名

–附加数据库
sp_attach_db '数据库名','数据库全路径','数据库日志全路径'
GO
USE 数据库名

–添加一个登录前指定默认数据库
EXEC sp_addlogin '登录名','密码','数据库名'
GO

–处理空登录名(使登录用户和数据库的孤立用户对应起来,在这个用户有对象时用)
sp_change_users_login 'update_one','登录名','登录名'
GO

–修改数据库的逻辑文件名(数据)
Alter DATABASE 数据库名
MODIFY FILE(NAME='老数据库逻辑文件名',NEWNAME='新数据库逻辑文件名')
GO

–修改数据库的逻辑文件名(日志)
Alter DATABASE 数据库名
MODIFY FILE(NAME='老日志逻辑文件名',NEWNAME='新日志逻辑文件名')
GO

可能会用到的操作:
–更改当前数据库名称为dbo的登录名为abc
EXEC sp_changedbowner 'abc'

–删除一个登录
EXEC sp_droplogin '登录名'

–赋予这个登录访问数据库的权限
EXEC sp_adduser '登录名','用户名','db_owner'