SQL学习笔记之存储过程

 
存储过程:是一种数据库对象,它是指服务器端需要反复使用的 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
 
 
我们先创建一个存储过程
 
test 表有如下数据
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 数据类型。

你可能感兴趣的:(数据库,职场,休闲,SQL学习笔记之存储过程)