1.学习网址
https://www.cnblogs.com/selene/p/4483612.html
2.优缺点
存储过程的优点:
1.存储过程加快系统运行速度,存储过程只在创建时编译,以后每次执行时不需要重新编译。
2.存储过程可以封装复杂的数据库操作,简化操作流程,例如对多个表的更新,删除等。
3.可实现模块化的程序设计,存储过程可以多次调用,提供统一的数据库访问接口,改进应用程序的可维护性。
4.存储过程可以增加代码的安全性,对于用户不能直接操作存储过程中引用的对象,SQL Server可以设定用户对指定存储过程的执行权限。
5.存储过程可以降低网络流量,存储过程代码直接存储于数据库中,在客户端与服务器的通信过程中,不会产生大量的T_SQL代码流量。
提高速度,降低流量,简化操作,增加安全性(数据库可指定用户权限访问存储过程)
存储过程的缺点:
1.数据库移植不方便,存储过程依赖与数据库管理系统, SQL Server 存储过程中封装的操作代码不能直接移植到其他的数据库管理系统中。
2.不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架.
3.代码可读性差,不易维护。不支持集群。
依赖数据库管理系统,移植性差等 我暂时只能了解这么深,抱歉
//
SQL语句写在数据库中,用户写SQL语句时,只需要写函数名称和参数即可。
3.我的使用
申明一个查询的存储过程
create proc searchA(
@id varchar(36)
)
as
select *from A where Id = @id
执行调用如下
exec searchA '1';
执行上面调用等于:
select * from A where id = '1' 《==》 exec searchA '1';
申明一个插入的存储过程
create proc insertA(
@id varchar(36),
@passnum char(20)
)
as
insert into dbo.A(Id,passnum) values(@id,@passnum)
调用如下
exec insertA '21','666';
执行上面调用等于:
insert into dbo.A(Id,passnum) values('21','666') 《==》 exec insertA '21','666'
其他存储过程类似
如删除
create proc deleteA(
@id varchar(36)
)
as
delete from A where Id=@id
调用删除过程
exec deleteA '5';
表名不能为参数 --下面这样不行
--create proc deleteAByName(
-- @tname char(20),
-- @id varchar(36)
--)
--as
-- delete from @tname where Id = @id
想要存储过程 表名也能为参数 设置,需类似下面这样
这样存储过程不针对哪一张表,不同的表也可以复用
create proc selectFromT(
@tname char(20),
@id varchar(36)
)
as
declare @sqlstr nvarchar(2000)
Begin
set @sqlstr = N'select * from '+@tname+' where Id ='+ @id
Execute sp_executesql @sqlstr
END
上面主要是用到了动态执行sql => Execute sp_executesql sqlstring
上面字符串我在前面加了N,虽然不加也可以
调用如下
exec selectFromT 'A','1';
--可能会有一些错误,要找出来自己改掉。