首页 文章

什么是存储过程?

提问于
浏览
259

什么是存储过程?他们是如何工作的?什么是存储过程的组成(每个必须是存储过程的东西)?

16 回答

  • 13

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

  • 3

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

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

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

    • 从数据上的某些业务逻辑中获取数据库结果集 .

    • 在一次调用中执行多个数据库操作 .

    • 用于将数据从一个表迁移到另一个表 .

    • 可以调用其他编程语言,如Java .

  • 6

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

  • 5

    想想这样的情况,

    • 您有一个包含数据的数据库 .

    • 访问该中央数据库需要许多不同的应用程序,并且将来也会有一些新的应用程序 .

    • 如果要在每个应用程序's code individually, then probably you have to duplicate the same query again and again inside different applications'代码中插入内联数据库查询以访问中央数据库 .

    • 在这种情况下,您可以使用存储过程(SP) . 使用存储过程,您将编写许多常见查询(过程)并将其与中央数据库一起存储 .

    • 现在重复工作将永远不会像以前那样发生,数据访问和维护将集中完成 .

    注意:

    • 在上述情况下,您可能想知道“为什么我们不能引入中央数据访问服务器来与所有应用程序进行交互?是的 . 这将是一种可能的替代方案 . 但是,

    • SP与该方法相比的主要优点是,与具有内联查询的数据访问代码不同,SP是预编译语句,因此它们的执行速度更快 . 通信成本(通过网络)将是最小的 .

    • 与此相反,SP将为数据库服务器增加一些负载 . 如果根据情况需要考虑,那么具有内联查询的集中式数据访问服务器将是更好的选择 .

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

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

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

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

  • 68

    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了解到这一点......它非常有用 .

  • 5

    "What is a stored procedure"已在此处的其他帖子中得到解答 . 我将发布的是一种鲜为人知的使用存储过程的方法 . 它是 grouping stored proceduresnumbering stored procedures .

    Syntax Reference

    ; number 根据this

    一个可选的整数,用于对同名的过程进行分组 . 可以使用一个DROP PROCEDURE语句将这些分组过程一起删除

    Example

    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
    

    Use

    exec FirstTest 10
    exec FirstTest;2 20,30
    

    Result

    Another Attempt

    CREATE Procedure SecondTest;2
    (
         @InputA INT,
        @InputB INT
    )
    AS 
    BEGIN
        SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
    END
    GO
    

    Result

    消息2730,级别11,状态1,过程SecondTest,行1 [批次开始行3]无法创建组号为2的过程'SecondTest',因为当前不存在具有相同名称和组号1的过程在数据库中 . 必须首先执行CREATE PROCEDURE'SecondTest'; 1 .

    References

    CAUTION

    • 对程序进行分组后,不能单独删除它们 .

    • 此功能可能会在Microsoft SQL Server的未来版本中删除 .

  • 0

    存储过程是一组已创建并存储在数据库中的SQL语句 . 存储过程将接受输入参数,以便使用不同输入数据的多个客户端可以在网络上使用单个过程 . 存储过程将减少网络流量并提高性能 . 如果我们修改存储过程,则所有客户端都将获得更新的存储过程 .

    样品创建存储过程

    CREATE PROCEDURE test_display
    AS
        SELECT FirstName, LastName
        FROM tb_test;
    
    EXEC test_display;
    

    使用存储过程的优点

    • 存储过程允许模块化编程 .

    您可以创建一次该过程,将其存储在数据库中,并在程序中多次调用它 .

    • 存储过程允许更快的执行 .

    如果操作需要重复执行大量SQL代码,则存储过程可以更快 . 它们在首次执行时被解析和优化,并且存储过程的编译版本保留在内存高速缓存中供以后使用 . 这意味着存储过程不需要在每次使用时重新分析和重新优化,从而导致更快的执行时间 .

    • 存储过程可以减少网络流量 .

    需要数百行Transact-SQL代码的操作可以通过执行过程中代码的单个语句来执行,而不是通过网络发送数百行代码 .

    • 存储过程为您的数据提供了更好的安全性

    即使用户没有直接执行过程语句的权限,也可以授予用户执行存储过程的权限 .

    在SQL Server中,我们有不同类型的存储过程:

    • 系统存储过程

    • 用户定义的存储过程

    • 扩展存储过程

    • System 存储过程存储在master数据库中,这些过程以 sp_ 前缀开头 . 这些过程可用于执行各种任务,以支持系统表中的外部应用程序调用的SQL Server函数

    示例:sp_helptext [StoredProcedure_Name]

    • User-defined 存储过程通常存储在用户数据库中,通常用于完成用户数据库中的任务 . 在编写这些过程 don’t use sp_ 前缀时,因为如果我们首先使用 sp_ 前缀,它将检查master数据库,然后它来到用户定义的数据库 .

    • Extended 存储过程是从DLL文件调用函数的过程 . 现在,不推荐使用扩展存储过程,因为最好避免使用扩展存储过程 .

  • 2

    存储过程只不过是一组编译成单个执行计划的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
    
  • 0

    为了简单,

    Stored ProcedureStored Programs ,存储在数据库中的程序/函数 .

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

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

    存储过程是一组预编译的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) .

  • 0

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

    使用存储过程可能会有所帮助

    • 提供对数据的受控访问(最终用户只能输入或更改数据,但无法编写程序)

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

    • 提高工作效率(存储过程的语句只需要写一次)

  • 0

    存储过程是一批可以以多种方式执行的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操作相关的维护 . 设's say for each table you have an Insert, Update, Delete and at least one select based on the primary key, that means each table will have 4 procedures. Now take a decent size database of 400 tables, and you have 1600 procedures! And that'假设你没有重复,你可能会 .

    这是使用ORM或其他方法自动生成基本CRUD操作的地方有很多优点 .

  • 32

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

  • 211

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

    • 如果您在申请中使用第三方程序处理付款,此处数据库应仅公开其所需的信息以及该第三方已获得授权的活动,我们可以通过使用存储过程设置权限来实现数据机密性 .

    • 表的更新应仅对其所针对的表进行,但不应更新任何其他表,通过该表可以使用事务处理和错误处理来实现数据完整性 .

    • 如果要返回一个或多个具有数据类型的项目,则最好使用输出参数 .

    • 在存储过程中,我们对需要返回的任何内容使用输出参数 . 如果只想返回一个只有整数数据类型的项,那么最好使用返回值 . 实际上,返回值仅用于通知存储过程的成功或失败 .

相关问题