SQL的存储过程 语法格式是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL的存储过程 语法格式是啥?相关的知识,希望对你有一定的参考价值。

sql server存储过程语法
存储过程就是作为可执行对象存放在数据库中的一个或多个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

以上存储过程,在delete顺利执行时,返回1,否则返回0,并进行回滚操作。为了在ASP中取得返回值,需要利用Parameters集合来声明参数:

'**调用带有返回值的存储过程并取得返回值**
DIM MyComm,MyPara
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串
MyComm.CommandText = "delUserAll" '指定存储过程名
MyComm.CommandType = 4 '表明这是一个存储过程
MyComm.Prepared = true '要求将SQL命令先行编译
'声明返回值
Set Mypara = MyComm.CreateParameter("RETURN",2,4)

MyComm.Parameters.Append MyPara
MyComm.Execute
'取得返回值
DIM retValue
retValue = MyComm(0) '或retValue = MyComm.Parameters(0)
Set MyComm = Nothing

在MyComm.CreateParameter("RETURN",2,4)中,各参数的含义如下:
第一个参数("RETURE")为参数名。参数名可以任意设定,但一般应与存储过程中声明的参数名相同。此处是返回值,我习惯上设为"RETURE";
第二个参数(2),表明该参数的数据类型,具体的类型代码请参阅ADO参考,以下给出常用的类型代码:
adBigInt: 20 ;
adBinary : 128 ;
adBoolean: 11 ;
adChar: 129 ;
adDBTimeStamp: 135 ;
adEmpty: 0 ;
adInteger: 3 ;
adSmallInt: 2 ;
adTinyInt: 16 ;
adVarChar: 200 ;
对于返回值,只能取整形,且-1到-99为保留值;
第三个参数(4),表明参数的性质,此处4表明这是一个返回值。此参数取值的说明如下:
0 : 类型无法确定; 1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值

以上给出的ASP代码,应该说是完整的代码,也即最复杂的代码,其实

Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara

可以简化为

MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)

甚至还可以继续简化,稍后会做说明。
对于带参数的存储过程,只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用,但我没有试成过)。

4. 有输入参数和输出参数的存储过程
返回值其实是一种特殊的输出参数。在大多数情况下,我们用到的是同时有输入及输出参数的存储过程,比如我们想取得用户信息表中,某ID用户的用户名,这时候,有一个输入参数----用户ID,和一个输出参数----用户名。实现这一功能的存储过程如下:

/*SP4*/
CREATE PROCEDURE dbo.getUserName
@UserID int,
@UserName varchar(40) output
as
set nocount on
begin
if @UserID is null return
select @UserName=username
from dbo.[userinfo]
参考技术A

这里以创建名为 GetStuCou 的无参数存储过程为例:

create procedure GetStuCou 

as 

begin     //开始存储过程

select *     from  Students     left join Course c  on  s.C_S_Id=c.C_Id 

end     //结束存储过程

下面是存储过程的其他用法:

--创建存储过程

CREATE PROCEDURE PROC(后面接类型)

--定义变量--简单赋值 

declare @a intset @a=5 print @a 

--使用select语句赋值 

declare @user1 nvarchar(50) 

select @user1='张三'

print @user1 

declare @user2 nvarchar(50)

--创建临时表1 create table #DU_User1

[ID] [int]  NOT NULL,

[Oid] [int] NOT NULL,

);

--定义一个游标

declare user_cur cursor for select ID,Oid,[Login] from ST_User 

--打开游标 

open user_cur 

while @@fetch_status=0 begin

--读取游标 

fetch next from user_cur into @ID,@Oid,@Login 

print @ID 

--print @Login 

end

close user_cur 

扩展资料

创建存储过程的注意事项:

1、保持事务简短,事务越短,越不可能造成阻塞。

2、在事务中尽量避免使用循环while和游标,以及避免采用访问大量行的语句。

3、在启动事务前完成所有的计算和查询等操作,避免同一事务中交错读取和更新。可以使用表变量预先存储数据。即存储过程中查询与更新使用两个事务实现。

4、超时会让事务不执行回滚,超时后如果客户端关闭连接sqlserver自动回滚事务。如果不关闭,将造成数据丢失,而其他事务将在这个未关闭的连接上执行,造成资源锁定,甚至服务器停止响应。

5、避免超时后还可打开事务 SET XACT_ABORT ON统计信息可以优化查询速度,统计信息准确可以避免查询扫描,直接进行索引查找。

参考技术B

sql中的存储过程及相关介绍:
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 outputASSELECT @p_tot = sum(Unitprice*Quantity)FROM orderdetailsWHERE orderid=@o_idGO例子说明:
该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的订单ID号码(@o_id),由订单明细表 (orderdetails)中计算该订单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序。

参考技术C ---判断是否存在存储过程
if exists( select name from sysobjects where name='proc_name' )
drop proc proc_name
go

---创建存储过程
create proc proc_name
@parameter varchar(20),
@parameter2 int
as
主体语句
go

if exists:判断是否存在
drop proc : 删除存储过程,后面接存储过程名称,名称不用引起来
create proc: 创建存储过程,后面接存储过程名称,名称不用引起来
@parameter varchar(20): 参数,在执行存储过程的时候需要传入的参数,这里是字符类型,如果有多个参数的话,除了最后一个参数,其他的参数后面需要加逗号(英文状态),如果不需要传入,直接去掉就行了。
create proc proc_name
as
主体语句
go

as : 关键字
主体语句:就是你要做的操作的语句,和平时的完全一样,存储过程就相当把平时的sql语句在外面加了个壳的感觉。比如这里你需要查询一个表 select * from tableName1 那么这里就这样写
create proc proc_name
as
select * from tableName1
go
传参数:
create proc proc_name
@parameter varchar(20)
as
select * from tableName where name=@parameter
go
执行的时候这样
exec proc_name '小明'

其他的操作都是这样的。

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

怎样在pl/sql中创建,执行和删除存储过程

sqlserver存储过程的基本操作:

一、创建存储过程

1、语法格式:

create proc | procedure pro_name
    [@参数数据类型 [=默认值] [output],
     @参数数据类型 [=默认值] [output],
     ....
    ]
as
    SQL_statements

   

以上是最基本语法,举个简单的例子:

CREATE proc p_test 
as
select retu = 1

2、执行存储过程

EXECUTE Procedure_name \'\' --存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value

3、删除存储过程

drop procedure procedure_name  --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程

   

参考技术A 存储过程是一类编译好的程序,在创建时进行编译,之后需要的时候值需要使用使用调用语句调用EXEC。

储存过程的分类:
1. 系统存储过程,存放在MASTER数据库中,以SP_前缀。
2. 用户自定义存储过程。

在SQL SERVER中创建储存过程语法:
Create proc[edure] procedure_name[;number]
[@parameter data_type
[varying][=default][output]
][,…n]
[with recompile|encryption|encrypton,recomption]
[for enplication]
As
Sql_statement[,…n]
参数:
整个语法中只有两个参数是必须的:procedure_name存储过程名称和sql_statement存储过程内容。
procedure_name:存储过程名称。
;number:对存储过程分组,“;数字”表示是一组存储过程,便于批量操作。
@parameter:参数名,命名必须用@开头;局部变量以@开头,全局变量以@@开头。
data_type:参数类型。
varying:指定作为输出参数的结果集。
Default:参数的默认值。
Output:表示为输出参数,返回值给execute/exe。
[with recompile|encryption|encrypton,recomption][for enplication]:这个我还不明白。。。
As:指定储存过程要执行的操作。

执行存储过程语法:
Exec[ute] 存储过程名 参数

实验一下,看看效果:
1.创建一组存储过程并且执行
create procedure procedure_a;1
as
select * from student
go
create procedure procedure_a;2
as
select * from student
go
执行创建效果截图:

图1创建一组存储过程
2.执行语句:
Execute procedure_a
效果截图:

图2执行存储过程效果截图
3.删除语句:
Drop procedure procedure_a
效果截图

图3删除一组储存过程效果截图

创建带输入参数的存储过程:输入参数是程序将参数值传递给存储过程。
创建一个带输入参数的存储过程,设置默认值,并且对输入参数的值进行判断。
Create procedure pro_1
@pro_1_a varchar(20)=null
As
If @pro_1_a is null
Print'请输入需要查询的所属院系:'
else
Select avg(成绩) from student where 所属院系=@pro_1_a
分别执行一下:
1.exec pro_1
效果截图:

图4执行不带输入参数的语句
2.exec pro_1 ‘计算机’
效果截图:

图5执行带输入参数的语句
哈哈,verygood,有进步啊。

创建带输出参数的存储过程:输出参数是存储过程将返回值传递给程序。
1.输出函数需要指定output作为标识
2.声明变量需要使用declare
3.给变量指定值需要使用select
来一个例子:如果一个数大于5,则计算他的阶乘。
Create procedure pro_2
/*声明输入输出参数*/
@in_x int,
@out_y int output
as
/*声明标量,并且赋值为1*/
Declare @x int,@y int
Select @x=1,@y=1
/*if语句判断输入值是否合法,使用while循环语句计算*/
If @in_x<=5
Print'请输入大于5的数:'
Else
While @x<=@in_x
Begin
Select @y=@y*@x
Select @x=@x+1
End
Select @out_y=@y
1.执行以上创建代码

图6创建带输入输出参数的存储过程截图
2.提供参数执行代码
Declare @out_sum int
Exec pro_2 6,@out_sum output
Select @out_sum as result

图7提供输入输出参数执行存储过程截图

创建多条语句的存储过程:一个存储过程中可以写入多条SQL语句,这些语句将被依次执行,可以实现多个功能。

删除存储过程delete及判断对象是否存在exists:
Delete procedure procedure_name
If exists(select子查询):如果exists的参数查询为非空,则exists结果为true,否则为假。
存储过程作为一个对象将被保存在数据库的sysobjects表中,可以使用语句判断这个对象是否存在:select * from sysobjects where name=’procedure_name’

几个系统存储过程的使用:
Sp_name:重命名对象-- Sp_name object1,object2
Sp_depends:显示引用对象—sp_depends students
Sp_help:显示对象信息
Sp_helptext:显示对象的源代码

以上是关于SQL的存储过程 语法格式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2000 中删除存储过程的语法是啥?

我的 SQL 存储过程中的 HTML 格式化语法无法正常工作

PG数据库存储过程包含存储过程报语法错误,麻烦大神看看是啥问题?

mysql 存储过程

如何在sqlserver存储过程中输出参数,语句是啥,我不用输出参数,我只是在体内输出语句,请问是啥??

怎样在Sql server中创建,执行和删除存储过程