Answers:
存储过程是可以以两种方式执行的一批SQL语句。大多数主要的DBM支持存储过程。但是,并非全部。您将需要使用特定的DBMS帮助文档进行验证以了解具体信息。由于我最熟悉SQL Server,因此将其用作示例。
要创建存储过程,语法非常简单:
CREATE PROCEDURE <owner>.<procedure name>
<Param> <datatype>
AS
<Body>
因此,例如:
CREATE PROCEDURE Users_GetUserInfo
@login nvarchar(30)=null
AS
SELECT * from [Users]
WHERE ISNULL(@login,login)=login
存储过程的一个好处是,您可以将数据访问逻辑集中到一个位置,以便DBA轻松优化。存储过程还具有安全优势,因为您可以授予存储过程执行权限,但是用户将不需要对基础表具有读/写权限。这是反对SQL注入的良好第一步。
存储过程确实有缺点,基本上是与基本CRUD操作相关的维护。假设每个表都有一个Insert,Update,Delete以及至少一个基于主键的选择,这意味着每个表将具有4个过程。现在,建立一个有400个表的体面大小的数据库,您就有1600个过程!并假设您没有可能会重复的重复项。
在这里使用ORM或其他方法自动生成基本的CRUD操作有很多优点。
存储过程是一组用于执行特殊任务的预编译SQL语句。
示例:如果我有一张Employee
桌子
Employee ID Name Age Mobile
---------------------------------------
001 Sidheswar 25 9938885469
002 Pritish 32 9178542436
首先,我要检索Employee
表:
Create Procedure Employee details
As
Begin
Select * from Employee
End
要在SQL Server上运行该过程:
Execute Employee details
--- (Employee details is a user defined name, give a name as you want)
接下来,我将值插入Employee表
Create Procedure employee_insert
(@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
As
Begin
Insert Into Employee
Values (@EmployeeID, @Name, @Age, @Mobile)
End
要在SQL Server上运行参数化的过程,请执行以下操作:
Execute employee_insert 003,’xyz’,27,1234567890
--(Parameter size must be same as declared column size)
例: @Name Varchar(30)
在Employee
表格中,Name
列的大小必须为varchar(30)
。
存储过程是一组已创建并存储在数据库中的SQL语句。存储过程将接受输入参数,因此多个客户端可以使用不同的输入数据在网络上使用单个过程。存储过程将减少网络流量并提高性能。如果我们修改存储过程,则所有客户端都将获取更新的存储过程。
创建存储过程的样本
CREATE PROCEDURE test_display
AS
SELECT FirstName, LastName
FROM tb_test;
EXEC test_display;
使用存储过程的优点
存储过程允许进行模块化编程。
您可以创建一次该过程,将其存储在数据库中,然后在程序中调用任意次。
存储过程可以加快执行速度。
如果该操作需要重复执行大量SQL代码,则存储过程可能会更快。首次执行时,将对它们进行解析和优化,并且存储过程的编译版本保留在内存缓存中以备后用。这意味着不需要每次使用都重新解析和优化存储过程,从而大大缩短了执行时间。
存储过程可以减少网络流量。
可以通过一条在过程中执行代码的语句来执行需要数百行Transact-SQL代码的操作,而不是通过网络发送数百行代码。
存储过程为您的数据提供了更好的安全性
即使没有权限直接执行该过程的语句,也可以授予用户执行存储过程的权限。
在SQL Server中,我们有不同类型的存储过程:
系统存储的过程存储在master数据库中,这些过程以sp_
前缀开头。这些过程可用于执行各种任务,以支持SQL Server函数对系统表中的外部应用程序进行调用
示例:sp_helptext [StoredProcedure_Name]
用户定义的存储过程通常存储在用户数据库中,并且通常旨在完成用户数据库中的任务。尽管编码这些程序不使用的sp_
前缀,因为如果我们使用的sp_
第一个前缀,它会检查主数据库,然后它涉及到用户定义的数据库。
扩展存储过程是从DLL文件调用函数的过程。如今,不建议使用扩展存储过程,因为最好避免使用扩展存储过程。
通常,存储过程是“ SQL函数”。他们有:
-- a name
CREATE PROCEDURE spGetPerson
-- parameters
CREATE PROCEDURE spGetPerson(@PersonID int)
-- a body
CREATE PROCEDURE spGetPerson(@PersonID int)
AS
SELECT FirstName, LastName ....
FROM People
WHERE PersonID = @PersonID
这是一个以T-SQL为重点的示例。存储过程可以执行大多数SQL语句,返回标量和基于表的值,并被认为更安全,因为它们可以防止SQL注入攻击。
想像这样的情况,
注意:
存储过程不过是一组编译为单个执行计划的SQL语句。
示例:创建一个存储过程
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetEmployee
@EmployeeID int = 0
AS
BEGIN
SET NOCOUNT ON;
SELECT FirstName, LastName, BirthDate, City, Country
FROM Employees
WHERE EmployeeID = @EmployeeID
END
GO
更改或修改存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE GetEmployee
@EmployeeID int = 0
AS
BEGIN
SET NOCOUNT ON;
SELECT FirstName, LastName, BirthDate, City, Country
FROM Employees
WHERE EmployeeID = @EmployeeID
END
GO
删除或删除存储过程:
DROP PROCEDURE GetEmployee
存储过程是一个或多个执行某些特定任务的SQL语句的预编译集合。
存储过程应独立执行,使用 EXEC
存储过程可以返回多个参数
存储过程可用于实现事务
这里的其他帖子中已经回答了“什么是存储过程”。我将发布的是使用存储过程的一种鲜为人知的方法。是grouping stored procedures
或numbering stored procedures
。
语法参考
; number
按照这个
一个可选的整数,用于对同名过程进行分组。可以使用一个DROP PROCEDURE语句将这些分组的过程放在一起
例
CREATE Procedure FirstTest
(
@InputA INT
)
AS
BEGIN
SELECT 'A' + CONVERT(VARCHAR(10),@InputA)
END
GO
CREATE Procedure FirstTest;2
(
@InputA INT,
@InputB INT
)
AS
BEGIN
SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO
采用
exec FirstTest 10
exec FirstTest;2 20,30
结果
另一尝试
CREATE Procedure SecondTest;2
(
@InputA INT,
@InputB INT
)
AS
BEGIN
SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO
结果
消息2730,级别11,状态1,过程SecondTest,行1 [Batch Start Line 3]无法创建组号为2的过程'SecondTest',因为当前不存在具有相同名称和组号1的过程数据库。必须先执行CREATE PROCEDURE'SecondTest'; 1。
参考文献:
警告
存储过程是SQL语句和过程逻辑的命名集合,即经过编译,验证和存储在服务器数据库中。通常将存储过程与其他数据库对象一样对待,并通过服务器安全性机制进行控制。
SQL Server中的存储过程可以接受输入参数,并返回输出参数的多个值;在SQL Server中,存储过程程序语句用于在数据库中执行操作并向调用过程或批处理返回状态值。
在SQL Server中使用存储过程的好处
它们允许模块化编程。它们允许更快地执行。它们可以减少网络流量。它们可以用作安全机制。
这是一个存储过程的示例,该存储过程采用参数,执行查询并返回结果。具体地说,存储过程接受BusinessEntityID作为参数,并使用它来匹配HumanResources.Employee表的主键以返回请求的员工。
> create procedure HumanResources.uspFindEmployee `*<<<---Store procedure name`*
@businessEntityID `<<<----parameter`
as
begin
SET NOCOUNT ON;
Select businessEntityId, <<<----select statement to return one employee row
NationalIdNumber,
LoginID,
JobTitle,
HireData,
From HumanResources.Employee
where businessEntityId =@businessEntityId <<<---parameter used as criteria
end
我是从essential.com中学到的...非常有用。
在“存储过程”中,语句仅写入一次,从而减少了客户端和服务器之间的网络流量。我们还可以避免Sql注入攻击。
ORM
喜欢Entity Framework
执行CRUD
操作?