用存储过程好,还是在代码中写SQL语句好

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用存储过程好,还是在代码中写SQL语句好相关的知识,希望对你有一定的参考价值。

这个问题看你从那方面考虑了,如果说从方便性,简易性来说存储过程当然好点了,许多代码都省了,还方便维护,不是随时改代码,与数据库交互次数也少了。但是存储过程的执行速度肯定没单条sql快,在响应速度来说就差了点,再说安全性也会差了点,一旦数据泄露就危险了,毕竟泄露一个sql和泄露一个存储过程来说,肯定存储过程的泄露威胁也会大很多。 参考技术A 我比较喜欢用存储过程,以后有什么小调整,可以直接调存储过程,不用再改代码了 参考技术B 这个要根据实际情况。。

老码农怀旧一个简单好用的分页存储过程

数据库存储过程是一组预先创建并用指定的名称存储在数据库服务器上的 SQL 语句,将使用比较频繁或者比较复杂的操作,预先用 SQL 语句写好并用一个指定的名称存储起来,以后当需要数据库提供与已定义好的存储过程的功能相同的服务时,只需再次执行该存储过程。

数据库存储过程的优点:
(1)存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。
(2)通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。
(3)存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。
(4)安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。

数据库存储过程的缺点:
(1)SQL本身的局限性-SQL本省是一种面向结构化查询的语言,本质是面向过程的,面对复杂的业务逻辑处理起来会力不从心
(2)移植性差,不同的数据库SQL语法有些差别
(3)不易调试
(4)对开发人员SQL能力要求比较高。ps:现在很多新手都不知道如何创建存储过程╮(╯_╰)╭ 
    目前常用的数据库都支持存储过程,例如 IBM DB2,Microsoft SQL Server,Oracle,Access 等,开源数据库系统 MySQL 也在 5.0 的时候实现了对存储过程的支持。

一个简单好用的分页存储过程实现

CREATE PROCEDURE [dbo].[SP_K_PAGE]
(
	@totalCount INT OUTPUT,  --过滤后的总记录数
	@tableName varchar(MAX),--表名
	@orderSql varchar(MAX),--排序字段
	@where nvarchar(MAX)=‘‘, --过滤条件
	@pageIndex int=1,--页码
	@pageSize int=10--页大小
)
AS 

DECLARE @pageSql NVARCHAR(MAX); --分页sql
DECLARE @whereSql NVARCHAR(MAX); --过滤sql
DECLARE @coungtSql NVARCHAR(MAX);--总记录数sql
SET @pageIndex=‘‘;
SET @whereSql=‘‘;
SET @totalCount=‘‘;
SET @coungtSql=‘‘;

IF @where <>‘‘
BEGIN 
	SET @whereSql=‘ WHERE (‘+ @where +‘)‘;
END

IF @pageIndex<=0
BEGIN
	SET @pageIndex=1;
END 

IF @pageSize<=0
BEGIN 
	SET @pageSize=10;
END 

SET @coungtSql=‘SELECT COUNT(*) FROM ‘+ @tableName +‘ WHERE ‘[email protected];

exec sp_executesql @coungtSql,N‘@Count INT OUTPUT‘, @totalCount OUTPUT

SET @pageSql=‘SELECT *  FROM ( SELECT ROW_NUMBER() OVER (ORDER BY ‘+ @orderSql +‘) pageIndex, * FROM ‘+ @tableName [email protected]+‘ ) t_page WHERE pageIndex > ‘
+ CONVERT(VARCHAR,@pageIndex) +‘ AND pageIndex <= ‘+CONVERT(VARCHAR,@pageSize);

EXEC(@pageSql)
GO

DECLARE @Count INT ;
EXEC SP_K_PAGE @Count OUTPUT,‘COURSE‘,‘Cource_Name‘,‘CreateTime < GETDATE()‘

我怀念那夕阳下的奔跑,那是我逝去的青葱!结束。

以上是关于用存储过程好,还是在代码中写SQL语句好的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程sql语句

我用sqlserver写好了一个存储过程 怎么样才能返回出一个搜索语句的结果集给c#

oracle存储过程中写IF ELES

mysql中的存储过程怎么使用

自动调用mysql存储过程

程序中使用嵌套的sql语句和在数据库中写存储过程调用它,有啥区别?