存储过程是一组为了完成特定功能的sql语句集,经编译后存储在数据库中,每次调用使用过程名并给出参数来执行
优点:
1 速度快,性能好, 重复使用它的缓存执行计划,节省了分析解析它的服务器资源和时间
2 减少网络流量
3 安全性强,参数化的过程更安全,减少sql攻击,可以通过校验参数,属于对象执行权限提高了安全性
4 业务逻辑封装
存储过程分类:
一般分为: 系统存储过程,一般以sp开头命名,扩展存储过程,一般以xp开头命名,
用户存储过程 (我一般以usp开头名称),用户存储过程也包括临时存储过程(又分为全局临时过程,局部临时过程)
创建过程前先判断:
IF OBJECT_ID(N'dbo.USP_GetEmployeById') IS NOT NULL
BEGIN
DROP PROC dbo.USP_GetEmployeById;
END
GO
IF (@EmployeeName IS NULL OR LEN(@EmployeeName) =0)
相当于C#的string.IsNullOrEmpty(@EmployeeName)
IF @@error = 0 受影响的行数
BEGIN TRY
END TRY
BEGIN CATCH
END CATCH
这玩意相当于c#的
try{ } catch (Exception){ throw; }
这样添加一个存储过程的输出参数
DECLARE @Result NVARCHAR(4);
复制代码
SET @Result = '';
EXEC dbo.USP_AddEmploye
@EmployeeName ='张飞',
@Sex =1 ,
@Department = '市场部',
@Success = @Result OUTPUT
SELECT @Result;
一般在执行存储过程是,最好加上架构名称,例如:dbo.USP_AddEmploye 这样可以可以减少不必要的系统开销,提高性能。 因为如果在存储过程名称前面没有加上架构名称、SQL SERVER 首先会从当前数据库sys schema开始查找,如果没有找到,则会去其它schema查找,最后在dbo架构里面查找。
查询过程创建成功后的信息
SELECT * FROM SYS.SQL_MODULES WHERE object_id =OBJECT_ID(N'dbo.usp_Test')
存储过程引用的表对象不需要在创建该存储过程时就存在,而只需在执行该存储过程时存在。这个叫延迟名称解析
SP_HELP 'dbo.USP_GetEmployeById' --查看存储过程的基本信息:例如参数等
SP_HELPTEXT 'dbo.USP_GetEmployeById' --查看具体的存储过程
SELECT * FROM SYS.SQL_MODULES WHERE object_id =OBJECT_ID(N'dbo.USP_GetEmployeById') --查看具体的存储过程
SP_HELP '[dbo].[Pr_Test]' --查看存储过程的基本信息:例如参数等
SP_HELPTEXT '[dbo].[Pr_Test]' --查看具体的存储过程
SELECT * FROM SYS.SQL_MODULES WHERE object_id =OBJECT_ID(N'[dbo].[Pr_Test]') --查看具体的存储过程
存储过程的加密
它一般通过关键字ENCRYPTION 来实现
SQL Server 将 CREATE PROCEDURE 语句的原始文本转换为模糊格式。模糊代码的输出在 SQL Server 2005 的任何目录视图中都不能直接显示。对系统表或数据库文件没有访问权限的用户不能检索模糊文本。但是,可通过 DAC 端口访问系统表的特权用户或直接访问数据库文件的特权用户可使用此文本。此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索已解密的过程。
--过程加密
CREATE PROCEDURE dbo.USP_GetEmployeById
@EmployeeID INT = -1,
@EmployeeName NVARCHAR(30) = NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON;
BEGIN
IF (@EmployeeID = -1 AND @EmployeeName IS NULL)
BEGIN
PRINT '请输入员工ID号或是用户名字';
END
IF @EmployeeID = -1
SELECT * FROM dbo.Employee WHERE EmployeeName = @EmployeeName;
ELSE
SELECT * FROM dbo.Employee WHERE EmployeeID = @EmployeeID;
END
GO
解密:
在网上找国外大牛写的解密加密存储过程的一个存储过程usp_decrypt