对数据库进行操作的时候,我们可以使用sql语句,也可以使用存储过程,那么使用存储过程有什么好处呢,首先它是预编译的语句,所以效率很高,其次就是很安全,用sql语句的时候有可能会被进行sql注入,存储过程完全被隐藏的,所以会避免,很安全,一般的情况下,一些小项目,比如web开发的时候,小企业站可以使用sql语句,大型的行业网站从安全和性能可以使用存储过程。
备注:可在Sql Server的管理器中通过新建存储过程创建测试,保证其在后台的语法的合理性。
预备知识:
创建存储过程的基本格式:
---判断是否存在存储过程
if exists( select name from sysobjects where name='proc_name' ) //if exists:判断是否存在
drop proc proc_name // drop proc : 删除存储过程,后面接存储过程名称,名称不用引起来
go
---创建存储过程
//create proc: 创建存储过程,后面接存储过程名称,名称不用引起来@parameter varchar(20): 参数,在执行存储过程的时候需要传入的参数,这里是字符类型,如果有多个参数的话,除了最后一个参数,其他的参数后面需要加逗号(英文状态),如果不需要传入,直接去掉就行了。
create proc proc_name @parameter varchar(20), @parameter2 int
as //as : 关键字
主体语句 //主体语句:就是你要做的操作的语句,和平时的完全一样,存储过程就相当把平时的sql语句在外面加了个壳的感觉。
go
例1 无参存储过程 这里你需要查询一个表 select * from tableName1
create proc proc_name
as
select * from tableName1
go
例 2带参存储过程:
create proc proc_name @parameter varchar(20)
as
select * from tableName where name=@parameter
go
执行的时候这样 exec proc_name '小明' //注意要加上单引号
注释:GO 是一个批处理实用工具命令.它可以由任何用户执行。其实相当于点击一次“!”执行查询功能。GO 10,代表执行10次存储过程。
1、例如,在同一批处理中,创建数据库之后不能直接使用其新建的数据库.局部(用户定义)变量的作用域限制在一个批处理中,不可在 GO 命令后引用.
create database [Roc]
use [Roc]
GO
--运行此批处理后,系统会报错,把此批处理分成两个批即可正确运行,修改如下。
create database [Roc]
GO
use [Roc]
GO
2、由于局部变量的作用域要限制在一个批处理中,所以在执行下面语句会报错,
declare @Roc varchar(max)
Select @Roc = 'aking'
GO
print @Roc
GO
修改为
declare @Roc varchar(max)
Select @Roc = 'aking'
print @Roc
GO
下面举例说明存储过程的写法:
A、不带参数的存储过程
create proc stuInfo
as
select * from student
go
B、带参数的存储过程
create proc stuBysex @sex varchar(50)
as
select * from student where sex=@sex
go
C、带输出参数的存储过程
create proc stuOutNamebyid
@outName varchar(50) output
as
select @outName=name from student where id='2'
go
declare @outName varchar(50) //一定要声明一下,否则会没有数据显示结果,只有sql语句分析结果
exec stuOutNamebyid @outName output
print @outName //也可写为select @outName
go
下面是增删改的存储过程
增加
create proc insertStu @name varchar(50),@sex varchar(50),@age int,@address varchar(50)
as
insert into Student(name,sex,age,address)values(@name,@sex,@age,@address)
go
exec insertStu 'shuang','女',34,'aaa'
go
删除
create proc delStu @id int
as
delete from Student where id=@Id
go
exec delStu '5'
go
修改
create proc UpdateStu @id int
as
update Student set name='aa' where id=@id
go
exec UpdateStu '4'
go
在创建存储过程的时候可以为参数赋默认值
alter proc proDemo @ datetime='2011-1-1',@c datetime='2011-5-30'
as
select top 20 * from u_userinfo where regdate between @b and @c
go
执行的时候,如果没有参数,可以不用写.exec proDemo
参考学习:http://www.cnblogs.com/scholar1986/archive/2010/03/24/1694086.html