什么是存储过程?
什么是存储过程? 他们如何工作? 什么是存储过程的组成(每个东西都必须是一个存储过程)?
存储过程是一批可以通过多种方式执行的SQL语句。 大多数主要DBM支持存储过程; 然而,并不是所有的事都做 您需要validation您的特定DBMS帮助文档。 正如我最熟悉的SQL Server,我将使用它作为我的样本。
要创build一个存储过程,语法非常简单:
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和至less一个基于主键的select,这意味着每个表将有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 Table
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)
。
存储过程是已创build并存储在数据库中的一组SQL语句。 存储过程将接受input参数,以便通过使用不同input数据的多个客户机可以在networking上使用单个过程。 存储过程将减lessnetworkingstream量并提高性能。 如果我们修改一个存储过程,所有的客户端将获得更新的存储过程。
创build存储过程的示例
CREATE PROCEDURE test_display AS SELECT FirstName, LastName FROM tb_test; EXEC test_display;
使用存储过程的优点
-
存储过程允许模块化编程。
您可以创build一次该过程,将其存储在数据库中,并在程序中多次调用该过程。
-
存储过程允许更快的执行。
如果操作需要大量重复执行的SQL代码,则存储过程可能会更快。 第一次执行时会对其进行分析和优化,并将存储过程的编译版本保留在内存高速caching中供以后使用。 这意味着存储过程不需要在每次使用时重新进行重新优化和重新优化,从而导致更快的执行时间。
-
存储过程可以减lessnetworkingstream量。
需要数百行Transact-SQL代码的操作可以通过执行代码的单个语句执行,而不是通过networking发送数百行代码。
-
存储过程为您的数据提供更好的安全性
即使用户没有权限直接执行过程语句,也可以授予用户执行存储过程的权限。
在SQL Server中,我们有不同types的存储过程:
- 系统存储过程
- 用户定义的存储过程
- 扩展存储过程
-
系统存储过程存储在主数据库中,并以
sp_
前缀sp_
。 这些过程可用于执行各种任务,以支持系统表中的外部应用程序调用的SQL Serverfunction示例:sp_helptext [StoredProcedure_Name]
-
用户定义的存储过程通常存储在用户数据库中,通常用于完成用户数据库中的任务。 虽然编码这些过程不使用
sp_
前缀,因为如果我们先使用sp_
前缀,它将检查master数据库,然后它到达用户定义的数据库。 -
扩展存储过程是从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注入攻击。
想想这样的情况,
- 你有一个数据库的数据。
- 访问该中央数据库需要多种不同的应用程序,并且在将来也会有一些新的应用程序。
- 如果您要插入内联数据库查询来访问中央数据库,请在每个应用程序的代码中分别进行访问,那么可能需要在不同的应用程序代码中一次又一次地复制相同的查询。
- 在这种情况下,您可以使用存储过程(SP)。 使用存储过程,您正在编写一些常见查询(过程),并将它们存储在中央数据库中。
- 现在重复工作不会像以前那样发生,数据访问和维护将集中在一起。
注意:
- 在上述情况下,您可能会想:“为什么我们不能引入一个中央数据访问服务器来与所有应用程序交互?是的,这将是一个可能的select,但是,
- 与此方法相比,SP的主要优势在于,与具有内嵌查询的数据访问代码不同,SP是预编译语句,所以它们的执行速度会更快。 通信成本(通过networking)将是最低的。
- 与此相反,SP会为数据库服务器增加一些负载。 如果根据情况这将是一个问题,具有内联查询的集中式数据访问服务器将是更好的select。
存储过程主要用于在数据库上执行某些任务。 例如
- 从数据的某些业务逻辑获取数据库结果集。
- 在一次调用中执行多个数据库操作。
- 用于将数据从一个表迁移到另一个表。
- 可以调用其他编程语言,如Java。
存储过程不过是一组编译成单个执行计划的SQL语句。
- 创build一次,并调用n次
- 它减less了networkingstream量
例如:创build一个存储过程
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数据库中的数据时,都不需要编写完整的SQL命令。
“什么是存储过程”已经在其他post中回答了。 我将会发布的是使用存储过程的一种较less已知的方式。 这是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
结果
状态1,程序SecondTest,行1 [批次起始行3] 2730,级别11,状态1的信息无法创build组编号为2的过程“SecondTest”,因为具有相同名称和组编号为1的过程当前不存在数据库。 必须首先执行CREATE PROCEDURE'SecondTest'; 1。
参考文献
- CREATE PROCEDURE与数字的语法
- 在SQL Server中编号的存储过程 – techie-friendly.blogspot.com
- 分组存储过程 – sqlmag
警告
- 在对这些程序进行分组之后,您不能单独删除它们。
- 未来版本的Microsoft SQL Server中可能会删除此function。
存储过程是SQL语句和过程逻辑的命名集合,即编译,validation并存储在服务器数据库中。 存储过程通常与其他数据库对象一样对待,并通过服务器安全机制进行控制。
-
存储过程是一组预编译的一个或多个执行某个特定任务的SQL语句。
-
存储过程应该使用
EXEC
独立EXEC
-
存储过程可以返回多个参数
-
一个存储过程可以用来实现事务
在DBMS中,存储过程是一组具有指定名称的SQL语句,它们以编译forms存储在数据库中,以便可以由多个程序共享。
存储过程的使用可能会有所帮助
-
提供对数据的受控访问(最终用户只能input或更改数据,但不能编写过程)
-
确保数据完整性(数据将以一致的方式input)
-
提高生产力(存储过程的语句只需要写入一次)
为了简单,
存储过程是stored procedures ,存储在数据库中的程序/函数。
每个存储的程序都包含一个由SQL语句组成的主体。 这个语句可能是一个复合语句,由多个用分号(;)分隔的语句组成。
CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET @x = 0; REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; END;
SQL Server中的存储过程可以接受input参数并返回多个输出参数值; 在SQL Server中,存储过程程序语句在数据库中执行操作,并将状态值返回给调用过程或批处理。
在SQL Server中使用存储过程的好处
他们允许模块化编程。 他们允许更快的执行。 他们可以减lessnetworkingstream量。 它们可以用作安全机制。
下面是一个存储过程的例子,它接受一个参数,执行查询并返回结果。 具体来说,存储过程接受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了解到这一点非常有用。