Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1241697
  • 博文数量: 510
  • 博客积分: 20296
  • 博客等级: 上将
  • 技术积分: 4680
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-30 03:58
文章存档

2011年(13)

2010年(92)

2009年(242)

2008年(163)

我的朋友

分类: 数据库开发技术

2010-09-19 00:32:05

    存储过程:是一种数据库对象,它是指服务器端需要反复使用的T-SQL语句的集合在其它编程语言中相当于T-SQL字程序。
    我们先来写一个入门的小例子:
  1. create procedure prhelloworld
  2. as
  3. select 'Hello Dejan’' --注意这里是单引号,用来输出文本Hello Dejan
  4. alter procedure prhelloworld/*修改存储过程*/
  5. as
  6. select 'Hello again'
  7. drop procedure prhelloworld/*删除存储过程*/
   小提示:在SQL中可以使用(--)二横来进行单行注释,可以用用/**/来进行多行注释

    在修改存储过程的时候有二种方法
   一种是:重建存储过程,要注意先要将已存在的存储过程删除
  1. drop proc prhelloworld
  2. go
  3. create procedure prhelloworld
  4. @Type varchar(50)—我们可以使用变量来接受外部值
  5. as
  6. select @Type
  7. go
    另外我们也可以使用系统表sysobjects表来判断存储过程是否存在,如下:
  1. if exists(select * from sysobjects 
  2.                    where id=object_id('prhelloworld') and 
  3.                          objectproperty (id,'isprocedure')=1)
  4. drop proc get
    另一种是:使用alter procedure 修改存储过程 
  1. alter procedure prhelloworld
  2. @Type varchar(50)
  3. as
  4. select @Type
  5. go
    小提示:存储过程的过程名最长为128字符,它最多可以带1024个输入输出参数,它的主体由一条至多条SQL语句组成,最大长度为128M

    现我们先创建一个表:
  1. if exists(select * from sysobjects where id=object_id(N'’[dbo].[test]’) and objectproperty (id,'isUserTable)=1)
  2. drop table [dbo].[test]
  3. GO
  4. CREATE TABLE [dbo].[test] (
  5.              [Id] [int] IDENTITY (1, 1) NOT NULL ,
  6.              [Name] [char] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,--这里要注意了,这是定义了一种排序规则,系统会对char /varchar自动生成一种排序规则的。
  7.              [***] [bit] NULL ,
  8.              [Age] [int] NULL
  9. ) ON [PRIMARY]
  10. GO

温习:表结构修改与排序规则
可使用 ALTER TABLE 语句更改列的排序规则:
CREATE TABLE test1 (PrimaryKey int PRIMARY KEY, Name varchar(20) COLLATE French_CI_AS NOT NULL )GOALTER TABLE test ALTER COLUMN Name            varchar(10)COLLATE Latin1_General_CI_AS NOT NULLGO
我们可以使用alter tabel来进行表的修改。它的语法如下
alter table test add height int null—添加一个整型height字段
alter table test alter column height char not null—修改字段heightchar型,并且不可以为空
alter table test drop column height—删除字段height
我们先创建一个存储过程
  1. create procedure pr_test
  2. @id int,
  3. @name char(20)
  4. as
  5. select age from test where [id]=@id and [name]=@name
    假设我们的test表有如下数据:
ID
NAME
***
AGE
1
zhangsan           
0
20
2
lisi               
1
21
3
wangwu            
1
28
4
zhaolui            
0
22
5
jiangqi            
0
20
    我们可以使用如下语句调用过程
  1. --这里只要在execute后面跟过程名就可以了,各参数用“,”分隔
  2. execute pr_test 1,'zhangsan'
    结果显示
     age
     20
    小提示SQL有些命令关键字可以只写前面4个字母。如execute可写成exec,procedure可写成proc
下面我们再来个例子
  1. alter procedure pr_test
  2. @id int,
  3. @name char(20),
  4. @age int output
  5. as
  6. select @age=age from test where [id]=@id and [name]=@name
    我们可以使用下面的语句调用存储过程
  1. declare @iage--这里使用declare来定义变量
  2. execute pr_test 1,'zhangsan',@age output
  3. select @iage '年龄'
     结果:
    年龄
     20
    注意在使用输出参数时,我们必有定义接受输出值的变量,作为输出参数时必有接关键字OUTPUT以便返回值赋给变量,并且后面用SELECT语句显示存储过程的返回结果
    接下来再做深一点的了解,我们看例子
  1. create proc pr_test_1
  2. @id int,
  3. @name char(20)
  4. as
  5. declare @age int
  6. select @age=age from test where [id]=@id and [name]=@name
  7. return @age
    上面的可以必成
  1. create proc pr_test_1
  2. @id int,
  3. @name char(20)
  4. as
  5. return (select @age=age from test where [id]=@id and [name]=@name)
     这里return跟的不是一个整型值而是一个整型表达式,return只可跟(int,smailinttinyint),这种返回值方法一般只用来返回状态信息给调用程序
    我们可以使用下面语句调用存储过程
  1. declare @age int
  2. exec @age=pr_test_1 9,"zhangsan"
  3. select @age '年龄'
     结果与上个一样
    下面我们来学习使用默认值
  1. create proc pr_test_2
  2. @id int=9,
  3. @name char(20)='zhangsan’
  4. as
  5. select * from test where [id] like @id or [name] like @name
  6. go
  7. exec pr_test_2 10,'lisi
    结果:
    ID  NAME     ***  AGE
    2     lisi         1     21
  1. exec pr_test_2 9
  2. exec pr_test_2
    上二句的结果都是
    ID   NAME    ***  AGE
    1     zhangsan   0    20
    小提示:我们可以给字符型变量设置通配符,这橛就可以使用模糊调用了,不过要注意,字符一定要设为varchar类型才可以。如上面的可以改成@name varchar(20) = ‘%’,这样就可以用exec pr_test_2 9,’z%’调用了。
    上面的可以讲我们是按位置调用调和,现在我们用按名称的方法调用过程,这样的话就可以傅没调用的按默认值。
    看实例:
  1. exec pr_test_2 @names='%l%'
   结果是:
    ID   NAME           ***  AGE
    1     zhangsan            0     20这条是默认值输出的结果
    2     lisi                   1     21
    4     zhaolui               0     22
   那么现在我们来把存储过程的完整语法写出来:
  1. CREATE PROC[EDURE] procedure_name[;number]

  2. [

  3.              {@parameter daty_type} [VARYING] [=default] [OUTPUT]

  4. ]

  5. [,…….n]

  6. [WITH {RECOMPTLE

  7. | ENCRYPTION

  8. | RECOMFILE,ENCRYFTION}

  9. ]

  10. [FROM REPLICATION]

  11. AS

  12. Sql_statement [,..n]
     当我们使用WITH Enycryption创建一个存储过程的时候,存储过程代码被加密,然后存储在数据库中。当要调用该存储过程的时候,系统会自动调用,加密的过程没人可以得到源码。当我们要每次使用时重编译存储过程我们可以加With Rcompile.用户可以使用[number]来创建一组存储过程,当要删除这组存储过程时,只要用一条语句就可以了,看下面的例子:
    假设有pr_test;1,pr_test;2,pr_test;3三个一组存储过程我们可以用
  1. Drop pr_test
    [Varying]可以处理输出参数是Cursor数据类型。

参考:
阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~