What ?
个人认为,存储过程说白了就是一堆SQL的合并,中间加了点逻辑控制,在组合查询的存储过程中深有体现。
官方解释:存储过程
还是一堆SQL语句的意思,O(∩_∩)O哈哈~
Why?
为什么要用存储过程,是为了解决什么?利弊?
- 利:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,可提高数据库执行速度。(这是我听说的涉及到原理性的问题,具体内部如何执行,小编也不知道呢,不过你记住就好!)
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),如果不用存储过程,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了,使系统对数据库的访问变得简单。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
所以,存储过程是用来当一个业务同时对多个表进行处理的时候比较合适。解决了速度慢,过多连接数据库,减少代码等的问题。
- 弊:
1、可移植性差,会依赖死数据库。切换数据库比较麻烦,比如从sqlserver切换到mysql。因为存储过程是依赖于具体的数据库的。
2、数据库的任务应该是专注于存储数据,至于业务逻辑的实现,交给程序来实现灵活扩展。数据库负责提供数据,至于拿到数据后,怎么处理,交给应用程序来,想怎么弄就怎么弄,视情况而定吧!
How ?
怎么运用
第一步:新建存储过程
第二步:存储过程模板
ALTER PROCEDURE [存储过程的命名]
……
定义参数
……
AS
Declare
声明变量
BEGIN
……
带业务逻辑的SQL语句
……
END
第三步:套用上面的模板
ALTER procedure [dbo].[PROC_GroupCheck]
@Comboa1 varchar(20),
@Comboa2 varchar(20),
@Comboa3 varchar(20),
@Combob1 varchar(20),
@Combob2 varchar(20),
@Combob3 varchar(20),
@Combod1 varchar(20),
@Combod2 varchar(20),
@txtc1 varchar(20),
@txtc2 varchar(20),
@txtc3 varchar(20),
@tableName varchar(20)
as
declare @TempSql varchar(500)
BEGIN
SET @TempSql='SELECT * FROM '+@tableName +' WHERE ' +@Comboa1 +@Combob1+char(39) + @txtc1 + char(39)
if (@Combod1!='')
BEGIN
SET @TempSql=@TempSql+@Combod1+CHAR(32)+@Comboa2 +@Combob2+CHAR(39)+@txtc2+CHAR(39)
if (@Combod2!='')
BEGIN
SET @TempSql=@TempSql+@Combod2+CHAR(32)+@Comboa3+@Combob3+CHAR(39)+@txtc3+CHAR(39)
END
END
EXECUTE(@TempSql)
end
第四步:如何调用存储过程
Public Function selectGroupCheck(GroupCheck As GroupCheckEntity) As DataTable Implements GroupCheckIDAL.selectGroupCheck
Dim sqlParams As SqlParameter() = {New SqlParameter("@Comboa1", GroupCheck.Comboa1),
New SqlParameter("@Comboa2", GroupCheck.Comboa2),
New SqlParameter("@Comboa3", GroupCheck.Comboa3),
New SqlParameter("@Combob1", GroupCheck.Combob1),
New SqlParameter("@Combob2", GroupCheck.Combob2),
New SqlParameter("@Combob3", GroupCheck.Combob3),
New SqlParameter("@Txtc1", GroupCheck.Txtc1),
New SqlParameter("@Txtc2", GroupCheck.Txtc2),
New SqlParameter("@Txtc3", GroupCheck.Txtc3),
New SqlParameter("@Combod1", GroupCheck.Combod1),
New SqlParameter("@Combod2", GroupCheck.Combod2),
New SqlParameter("@TableName", GroupCheck.TableName)} '设置参数
sql = "PROC_GroupCheck" '调用存储过程
table = sqlHelperObject.ExecSqlSelect(sql, CommandType.StoredProcedure, sqlParams)
Return table
End Function
End Class