定义
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
创建过程
- 打开SQL Server
- 打开数据库
- 点击“可编程性”
- 新建“存储过程”
机房重构的存储过程代码
USE [YZY.Charge]
GO
/****** Object: StoredProcedure [dbo].[PROC_GroupCheck] Script Date: 18/9/23 17:49:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: 杨子颍
-- Create date: 2018-09-18
-- Description: 组合查询进行数据交互
-- =============================================
ALTER PROCEDURE [dbo].[PROC_GroupCheck]
-- Add the parameters for the stored procedure here
/**** 需要传递的参数 ****/
@cmbFiled1 varchar(20),
@cmbFiled2 varchar(20),
@cmbFiled3 varchar(20),
@cmbMark1 varchar(20),
@cmbMark2 varchar(20),
@cmbMark3 varchar(20),
@cmbContext1 varchar(20),
@cmbContext2 varchar(20),
@cmbContext3 varchar(20),
@cmbRelationships1 varchar(20),
@cmbRelationships2 varchar(20),
@tableName varchar(20)
AS
declare @TempSql varchar(500) --临时存放sql语句
--Char (32) 是空格 插入(39)是单引号
BEGIN
--一个条件的查询
SET @TempSql='SELECT * FROM'+@tableName+'WHERE'+@cmbFiled1+@cmbMark1+char(39)+@cmbContext1+char(39)
if(@cmbRelationships1!='')
BEGIN
--两个条件的查询
SET @TempSql=@TempSql+@cmbRelationships1+char(32)+@cmbFiled2+@cmbMark2+char(39)+@cmbContext2+char(39)
if(@cmbRelationships2!='')
BEGIN
--三个条件的查询
SET @TempSql=@TempSql+@cmbRelationships2+char(32)+@cmbFiled3+@cmbMark3+char(39)+@cmbContext3+char(39)
END
END
EXECUTE(@TempSql)
END
D层代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Entity;
using IDAL;
namespace DAL
{
public class StuInfoDAL:IStuInfoIDAL
{
public DataTable SelectStudent(CombinedQuery student)
{
SQLHelper sqlhelper = new SQLHelper();
SqlParameter[] sqlParameter = {
new SqlParameter("@cmbFiled1",student.CmbFiled1),
new SqlParameter("@cmbFiled2",student.CmbFiled2),
new SqlParameter("@cmbFiled3",student.CmbFiled3),
new SqlParameter("@cmbMark1",student.CmbMark1),
new SqlParameter("@cmbMark2",student.CmbMark2),
new SqlParameter("@cmbMark3",student.CmbMark3),
new SqlParameter("@cmbContext1",student.CmbContext1),
new SqlParameter("@cmbContext2",student.CmbContext2),
new SqlParameter("@cmbContext3",student.CmbContext3),
new SqlParameter("@cmbRelationships1",student.CmbRelationships1),
new SqlParameter("@cmbRelationships2",student.CmbRelationships2),
new SqlParameter("@cmbtableName",student.CmbtableName)
};
string sql = @"PROC_CombinedQuery";
DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParameter, CommandType.StoredProcedure);
return dt;
}
}
}
优点
- 重复使用。
存储过程可以重复使用,从而可以减少数据库开发人员的工作量。 - 减少网络流量。
存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。 - 安全性。
参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
简单讲:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权