一:解释
SQL Server提供了一种方法:可以将一些预先编译的SQL语句集中起来由SQL Server数据库服务器来完成以实现某个任务,这就是存储过程。存储过程常驻在SQL Server数据库服务器的内存中。
二:优点
1.运行的熟读快,比SQL语句执行速度快2~10倍
2.可以接受参数,输出参数返回单个或多个结果集以及返回值。可以向程序返回错误的原因
3.运行稳定错误较少
4.主要是在服务器上运行,减少对客户机的压力
5.可以包含程序流、逻辑以及对数据库的查询
6.可以在单个存储过程中执行一系列的SQL语句
7.增加网络流量,降低网络负担,如果使用单条调用语句的方式,就必须传输大量的SQL语句
三:结构
![](https://img-blog.csdnimg.cn/2022010700050374561.png)
实例:
定义一个存储过程:
CREATE PROCEDURE Department_Add
-- Add the parameters for the stored procedure here
@DepartmentName nvarchar(50),
@Tel1 nvarchar(20),
@Tel2 nvarchar(20),
@Displayorder int
AS
BEGIN
INSERT INTO Department
(
DepartmentName,
Tel1,
Tel2,
Displayorder
)
VALUES
(
@DepartmentName,
@Tel1,
@Tel2,
@Displayorder
)
END
GO
右键:执行
执行成功:
![](https://img-blog.csdnimg.cn/2022010700050322125.png)
执行生成的SQL语句:
![](https://img-blog.csdnimg.cn/2022010700050485923.png)
通用的修改的存储过程:
语句:
-- =============================================
-- Author: 孙丽媛
-- Create date: 2016-9-27
-- Description: 通用的存储过程
-- =============================================
CREATE PROCEDURE UpdateTableByCondition
@tableName nvarchar(100), --修改的表
@columns nvarchar(300), --修改的列
--@values nvarchar(600), --修改的值
@conditions nvarchar(500)=‘1=1’ --修改的条件
AS
BEGIN
declare @sql nvarchar(2000) --定义sql语句
--对变量赋值1.select 在查询中赋值
--2.set 直接赋值
SET @sql='UPDATE '+@tableName+' set '+@columns+' where '+@conditions
print @sql
END
执行的效果图:
![](https://img-blog.csdnimg.cn/2022010700050462496.png)
通用删除的存储过程:
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: 通用的删除存储过程
-- =============================================
CREATE PROCEDURE DeleteTableByCondition
@tableName nvarchar(100), -- 删除的表
@condition nvarchar(500)='' --删除的条件
AS
BEGIN
declare @Sql nvarchar(1000)
SET @Sql = 'Delete from '+@tableName+' '+@condition
--print @Sql
EXEC(@Sql)
END
GO
通用添加的存储过程:
Create proc CommonInsertProc
(
@tbName nvarchar(255),--表名
@fldName nvarchar(1000),--列名
@fldValue nvarchar(2000) --值
)
As
Set nocount on
/*定义变量*/
Declare @strSQL varchar(4000)
Set @strSQL='Insert into ['+@tbName+'] ('+@fldName +') values('+@fldValue +')'
Exec(@strSQL)
Go
通用查询的存储过程:
1.实现查询指定表返回所有信息
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: 根据指定表返回所有数据
-- =============================================
CREATE PROCEDURE GetDataByTableName
@tableName nvarchar(2000)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Sql nvarchar(2000)
SET @Sql='select * from '+@tableName
EXEC(@Sql)
END
GO
2.实现查询指定表指定列返回信息
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: 查询指定的表,指定列的信息
-- =============================================
CREATE PROCEDURE getDataByTableNameValue
@tableName nvarchar(500),
@columns nvarchar(2000)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Sql nvarchar(4000)
SET @Sql='select '+@columns+' from '+@tableName
EXEC(@Sql)
End
GO
3.实现查询指定表按照不同的条件查询返回信息
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: 根据指定列,指定条件,指定表查询数据
-- =============================================
CREATE PROCEDURE GetDataByCondition
@tableName nvarchar(200),
@columns nvarchar(500),
@condition nvarchar(500)=' 1=1'
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sqlStr nvarchar(2000)
SET @sqlStr='select '+@columns+' from '+@tableName+' where '+@condition
EXEC(@sqlStr)
END
GO
分页的通用存储过程:
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: 分页数据查询
-- =============================================
CREATE PROCEDURE getDataByPageIndex
@table nvarchar(200), --查询表
@coumlns nvarchar(1000), --查询列
@pk nvarchar(50), --主建列
@condition nvarchar(500)=' and 1=1 ', --查询条件
@pageIndex int=0, --列的索引
@pageSize int=10 --列的页数
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sql nvarchar(4000)
SET @sql='select top '+CAST(@pageSize AS nvarchar(10))+' '+@coumlns +' from '+@table+' where '+@pk +' not in (
select top '+CAST((@pageSize*@pageIndex) AS nvarchar(10))+' '+ @pk+ ' FROM '+@table+ ' where 1=1 '+@condition+')'+@condition
END
GO