存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。
存储过程作用:
(1) 存储过程通过参数传递,安全性高,可防止注入式攻击.
(2) 查询的语句在存储过程里,与程序不相关,如果以后要修改程序或者数据库,都不会出现连锁反应,增加系统可扩展性.
(3) 网站执行查询的时候,只需要传递简单的参数就可以了,无论是代码优化上还是查询优化上都可以做到高效.
(4) 允许模块化编程,即,可以将一组查询写在一个过程里面,然后在程序里直接调用,而不必每次都写若干个语句来实现相应功能
具体使用:数据表来源http://blog.csdn.net/buyingfei8888/article/details/17399837
1 存储过程进行简单查询
if exists(select 1 from sysobjects where id=object_id('test') and xtype='P') --判断存储过程是否存在 drop proc test; go create proc test as select s_name 商店名字,s_address 商店地址,c_name 销售人员 from t_shop,t_cash_housewoker where s_id in(select s_id from manage where m_id=1) and t_cash_housewoker.m_id=1
执行:
exec test
对上面几个词汇解释 sysobjects object_id:
1、sysobjects
在sqlserver2005,sqlserver2008版本的数据库里,现在已经作为一个视图对象,在每一个数据库的系统视图中,都存在一个sys.sysobjects 视图对象。
sysobjects 重要字段解释:
sysObjects (
Name sysname, --object 名称
id int, --object id
xtype char(2), -- object 类型
type char(2), -- Object 类型(与xtype 似乎一模一样? 有点郁闷…)
uid smallint, -- object 所有者的ID
... --其他的字段不常用到。
)
注:需要解释的是 xtype 和type 是一模一样的,他的数据为:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
FN = 标量函数
IF = 内嵌表函数
K = PRIMARY KEY 或 UNIQUE 约束
L = 日志
P = 存储过程
R = 规则
RF = 复制筛选 存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
V = 视图
X = 扩展 存储过程
AF = 聚合函数 (CLR)
FS = 程序集 (CLR) 标量函数
FT = 程序集 (CLR) 表值函数
IF = 内联表函数
IT = 内部表
PC = 程序集 (CLR) 存储过程
PK = PRIMARY KEY 约束(type 为 K)
SN = 同义词
SQ = 服务队列
TA = 程序集 (CLR) DML 触发器
TT = 表类型
UQ = UNIQUE 约束(type 为 K)
该表中包含该数据库中的所有对象,如有那些表 存储过程 视图 等信息
2 object_id
在sysobjects系统表中存储着数据库的所有对象,每个对象都有一个唯一的id号进行标识.
object_id就是根据对象名称返回该对象的id.
2 带参数存储if (object_id('test', 'P') is not null) drop proc test go create proc test(@Id int) as select s_name 商店名字,s_address 商店地址,c_name 销售人员 from t_shop,t_cash_housewoker where s_id in(select s_id from manage where m_id=@Id) and t_cash_housewoker.m_id=@Id go
执行:
exec test 1;
3 带通配符的存储
if (object_id('test', 'P') is not null) drop proc test go create proc test(@name varchar(20) = '%j%', @nextName varchar(20) = '%') as select * from manage where m_name like @name or m_name like @nextName; go
执行:
exec test; exec test '%步%', '%u%';
4 带输出参数的存储过程
if (object_id('test', 'P') is not null) drop proc test go create proc test( @id int, --默认输入参数 @name varchar(20) out, --输出参数 @age varchar(20) output--输入输出参数 ) as select @name=m_name,@age=m_bir from manage where m_id=@id
执行:
declare @id int, @name varchar(20), @bir varchar(20); set @id = 1; exec test @id, @name out, @bir output; select @name, @bir; print @name + '#' + @bir;