什么是存储过程?


298

什么是“存储过程”,它们如何工作?

存储过程的组成是什么(每个事物都必须是存储过程)?

Answers:


243

存储过程是可以以两种方式执行的一批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操作有很多优点。


1
您是说存储过程读取数据并且ORM喜欢Entity Framework执行CRUD操作?
shaijut

2
是的,这是一种可能的方法。我们将ORM用作报告以外的所有内容
JoshBerke,

有关存储过程的更多详细信息,请参考我的URL techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh,

150

存储过程是一组用于执行特殊任务的预编译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)


1
容易理解的示例
HaFiz Umer

80

存储过程是一组已创建并存储在数据库中的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文件调用函数的过程。如今,不建议使用扩展存储过程,因为最好避免使用扩展存储过程。


37

通常,存储过程是“ 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注入攻击。


16

想像这样的情况,

  • 您有一个包含数据的数据库。
  • 访问该中央数据库需要许多不同的应用程序,将来还会有一些新应用程序。
  • 如果要在每个应用程序的代码内分别插入内联数据库查询以访问中央数据库,则可能必须在不同应用程序的代码内一次又一次地复制同一查询。
  • 在这种情况下,您可以使用存储过程(SP)。使用存储过程,您将编写许多常见查询(过程)并将其存储在中央数据库中。
  • 现在,重复工作将永远不会像以前那样发生,并且数据访问和维护将集中进行。

注意:

  • 在上述情况下,您可能会想:“为什么我们不能引入中央数据访问服务器来与所有应用程序进行交互?是的。这可能是一种替代方法。但是,
  • 与这种方法相比,SP的主要优势在于,与带有内联查询的数据访问代码不同,SP是预编译的语句,因此它们的执行速度更快。通信成本(通过网络)将最小。
  • 与此相反,SP将为数据库服务器增加更多负载。如果根据情况需要考虑,带有内联查询的集中式数据访问服务器将是一个更好的选择。

9

存储过程主要用于在数据库上执行某些任务。例如

  • 从数据的某些业务逻辑获取数据库结果集。
  • 在一个调用中执行多个数据库操作。
  • 用于将数据从一个表迁移到另一表。
  • 可以调用其他编程语言,例如Java。

7

存储过程不过是一组编译为单个执行计划的SQL语句。

  1. 创建一次并调用n次
  2. 减少网络流量

示例:创建一个存储过程

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

6

存储过程用于检索数据库表中的数据,修改数据和删除数据。您不需要每次想在SQL数据库中插入,更新或删除数据时都编写整个SQL命令。


4
  • 存储过程是一个或多个执行某些特定任务的SQL语句的预编译集合。

  • 存储过程应独立执行,使用 EXEC

  • 存储过程可以返回多个参数

  • 存储过程可用于实现事务


4

这里的其他帖子中已经回答了“什么是存储过程”。我将发布的是使用存储过程的一种鲜为人知的方法。是grouping stored proceduresnumbering 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。

参考文献

  1. 使用number的语法创建过程
  2. SQL Server中的编号存储过程-techie-friendly.blogspot.com
  3. 对存储过程进行分组-sqlmag

警告

  1. 对过程进行分组后,您将无法单独删除它们。
  2. 将来的Microsoft SQL Server版本中可能会删除此功能。

0

存储过程是SQL语句和过程逻辑的命名集合,即经过编译,验证和存储在服务器数据库中。通常将存储过程与其他数据库对象一样对待,并通过服务器安全性机制进行控制。


0

在DBMS中,存储过程是一组具有指定名称的SQL语句,它们以已编译的形式存储在数据库中,以便可以被许多程序共享。

使用存储过程可以在以下方面有所帮助

  1. 提供对数据的受控访问(最终用户只能输入或更改数据,但不能编写过程)

  2. 确保数据完整性(数据将以一致的方式输入)和

  3. 提高生产力(存储过程的语句只需编写一次)


0

简单来说,

存储过程存储程序,一种存储在数据库中的程序/功能。

每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由多个用分号(;)字符分隔的语句组成的复合语句。

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

0

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中学到的...非常有用。


0

存储过程将帮助您在服务器中编写代码。您可以传递参数并查找输出。

create procedure_name (para1 int,para2 decimal)
as
select * from TableName

0

在“存储过程”中,语句仅写入一次,从而减少了客户端和服务器之间的网络流量。我们还可以避免Sql注入攻击。

  • 如果您在应用程序中使用第三方程序来处理付款,则此处的数据库应仅公开其需要的信息以及该第三方已被授权的活动,这样我们可以通过使用存储过程设置权限来实现数据机密性。
  • 表的更新仅应针对它所针对的表进行,而不应更新任何其他表,这样我们就可以使用事务处理和错误处理来实现数据完整性。
  • 如果要返回一个或多个数据类型的项目,则最好使用输出参数。
  • 在存储过程中,对于需要返回的任何内容,我们使用输出参数。如果只想返回仅具有整数数据类型的一项,则最好使用返回值。实际上,返回值仅用于通知存储过程的成功或失败。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.