存储过程:是一种数据库对象,它是指服务器端需要反复使用的
T-SQL
语句的集合
.,
在其它编程语言中相当于
T-SQL
字程序。
我们先来写一个入门的小例子,
create procedure prhelloworld
as
select 'Hello Dejan’' --注意这里是单引号,用来输出文本Hello Dejan
alter procedure prhelloworld /*修改存储过程*/
as
select 'Hello again'
drop procedure prhelloworld /*删除存储过程*/
小提示:在
SQL
中可以使用(
--
)二横来进行单行注释,可以用用
/**/
来进行多行注释
在
修改存储过程的时候有二种方法
一种是:重建存储过程,要注意先要将已存在的存储过程删除
sysobjects
表来判断存储过程是否存在,如下
drop proc prhelloworld
go
create procedure prhelloworld
@Type varchar(50)—我们可以使用变量来接受外部值
as
select @Type
go
另外我们也可以使用系统表
128
字符,它最多可以带
1024
个输入输出参数,它的主体由一条至多条
SQL
语句组成,最大长度为
128M
。
if exists( select * from sysobjects where id= object_id( ' prhelloworld‘) and objectproperty (id,'isprocedure')=1)
drop proc get
另一种是:使用 alter procedure 修改存储过程
alter procedure prhelloworld
@Type varchar(50)
as
select @Type
go
小提示:存储过程的过程名最长为
现我们先创建一个表,
if exists( select * from sysobjects where id= object_id(N '’[dbo].[test]’) and objectproperty (id,'isUserTable)=1)
drop table [dbo].[test]
GO
CREATE TABLE [dbo].[test] (
[Id] [ int] IDENTITY (1, 1) NOT NULL ,
[ Name] [ char] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , --这里要注意了,这是定义了一种排序规则,系统会对char /varchar自动生成一种排序规则的。
[Sex] [ bit] NULL ,
[Age] [ int] NULL
) ON [ PRIMARY]
GO
温习
可使用
ALTER
TABLE
语句更改列的排序规则:
CREATE TABLE test1 (PrimaryKey int PRIMARY KEY, Name varchar(20) COLLATE French_CI_AS NOT NULL )
GO
ALTER TABLE test ALTER COLUMN Name
varchar(10)COLLATE Latin1_General_CI_AS NOT NULL
GO
我们可以使用
alter tabel
来进行表的修改。它的语法如下
alter table test add height int null—
添加一个整型
height
字段
alter table test alter column height char not null—
修改字段
height
为
char
型,并且不可以为空
alter table test drop column height—
删除字段
height
我们先创建一个存储过程
create procedure pr_test
@id int,
@ name char(20)
as
select age from test where [id]=@id and [ name]=@ name
假设我们的
ID
|
NAME
|
SEX
|
AGE
|
1
|
zhangsan
|
0
|
20
|
2
|
lisi
|
1
|
21
|
3
|
wangwu
|
1
|
28
|
4
|
zhaolui
|
0
|
22
|
5
|
jiangqi
|
0
|
20
|
我们可以使用如下语句调用过程
execute pr_test 1, 'zhangsan' --这里只要在execute后面跟过程名就可以了,各参数用“,”分隔
结果显示
age
20
小提示
SQL
有些命令关键字可以只写前面
4
个字母。如
execute
可写成
exec,procedure
可写成
proc
下面我们再来个例子
alter procedure pr_test
@id int,
@ name char(20),
@age int output
as
select @age=age from test where [id]=@id and [ name]=@ name
我们可以使用下面的语句调用存储过程
declare @iage --这里使用declare来定义变量
execute pr_test 1, 'zhangsan',@age output
select @iage '年龄'
年龄
20
注意在使用输出参数时,我们必有定义接受输出值的变量,作为输出参数时必有接关键字
OUTPUT
以便返回值赋给变量,并且后面用
SELECT
语句显示存储过程的返回结果
接下来再做深一点的了解,我们看例子
create proc pr_test_1
@id int,
@ name char(20)
as
declare @age int
select @age=age from test where [id]=@id and [ name]=@ name
return @age
上面的可以必成
return
跟的不是一个整型值而是一个整型表达式,
return
只可跟(
int,smailint
和
tinyint
),这种返回值方法一般只用来返回状态信息给调用程序
create proc pr_test_1
@id int,
@ name char(20)
as
return ( select @age=age from test where [id]=@id and [ name]=@ name)
这里
我们可以使用下面语句调用存储过程
declare @age int
exec @age=pr_test_1 9,"zhangsan"
select @age '年龄'
结果与上个一样
下面我们来学习使用默认值
create proc pr_test_2
@id int=9,
@ name char(20)='zhangsan’
as
select * from test where [id] like @id or [ name] like @ name
go
exec pr_test_2 10, 'lisi'
结果
Id name sex age
2 lisi 1 21
exec pr_test_2 9
exec pr_test_2
上二句的结果都是
Id name sex age
1 zhangsan 0 20
小提示:我们可以给字符型变量设置通配符,这橛就可以使用模糊调用了,不过要注意,字符一定要设为
varchar
类型才可以。如上面的可以改成
@name varchar(20) = ‘%’,
这样就可以用
exec pr_test_2 9,’z%’
调用了。
上面的可以讲我们是按位置调用调和,现在我们用按名称的方法调用过程,这样的话就可以傅没调用的按默认值。
看实例
exec pr_test_2 @names= '%l%'
结果是
Id name
sex age
1 zhangsan 0 20—
这条是默认值输出的结果
2 lisi 1 21
4 zhaolui 0 22
那么现在我们来把存储过程的完整语法写出来
WITH Enycryption
创建一个存储过程的时候,存储过程代码被加密,然后存储在数据库中。当要调用该存储过程的时候,系统会自动调用,加密的过程没人可以得到源码。当我们要每次使用时重编译存储过程我们可以加
With Rcompile.
用户可以使用
[
;
number]
来创建一组存储过程,当要删除这组存储过程时,只要用一条语句就可以了,看下面的例子
CREATE PROC[EDURE] procedure_name[;number]
[
{@parameter daty_type} [ VARYING] [= default] [OUTPUT]
]
[,…….n]
[ WITH {RECOMPTLE
| ENCRYPTION
| RECOMFILE,ENCRYFTION}
]
[ FROM REPLICATION]
AS
Sql_statement [,…..n]
当我们使用
假设有
pr_test;1,pr_test;2,pr_test;3
三个一组存储过程我们可以用
Drop pr_test --将三个(一组)都删除。
[Varying]
可以处理输出参数是
Cursor
数据类型。