将单个存储过程用于多个操作有什么好处还是我的老师错了?
Are there any advantages in using a single stored procedure for multiple operations or is my teacher wrong?
我正在处理我的数据库 class 期末项目,该项目包括制作一个可以访问数据库并在数据库中执行操作的应用程序。我的老师坚持认为我应该根据 table:
使用一个存储过程
--In stored procedure "sp_Ciudades"
@Opcion int,
@IdCiudad int = NULL,
@IdEstado int = NULL,
@Nombre varchar(50) = NULL
AS
BEGIN
--Create new record
IF @Opcion = 1
BEGIN
INSERT INTO Ciudades
VALUES(@IdEstado, @Nombre)
END
--Delete record
IF @Opcion = 2
BEGIN
DELETE FROM Ciudades
WHERE IdCiudad = @IdCiudad
END
--Update city
IF @Opcion = 3
BEGIN
UPDATE Ciudades
SET IdEstado = @IdEstado
Nombre = @Nombre
WHERE IdCiudad = @IdCiudad
END
--Retrieve cities
IF @Opcion = 4
BEGIN
SELECT *
FROM Ciudades
WHERE IdCiudad = @IdCiudad OR @IdCiudad = 0 OR @Ciudad IS NULL
END
--Fill cities ComboBox
IF @Opcion = 5
BEGIN
SELECT IdCiudad, Nombre
FROM Ciudades
ORDER BY Nombre
END
END
另一方面,我尝试做这样的事情:
--In stored procedure "sp_Ciudades_Vista"
@IdCiudad int = NULL
AS
BEGIN
SELECT *
FROM Ciudades
WHERE IdCiudad = @IdCiudad OR @IdCiudad = 0 OR @IdCiudad IS NULL
ORDER BY ID
END
--In stored procedure "sp_Ciudades_Cambio"
@IdCiudad int,
@IdEstado int,
@Nombre varchar(50)
AS
BEGIN
UPDATE Ciudades
SET IdEstado = @IdEstado,
Nombre = @Nombre
WHERE IdCiudad = @IdCiudad
END
我觉得在我的应用程序中定义命令字符串时代码更有条理(和封装)并且更容易阅读和理解(使用数字选项我经常不得不返回过程定义才能看到每个数字的作用)。另外,我只使用了实现操作所需要的参数。
但是,我的老师说,如果我这样做,数据库将有太多的存储过程,因为 在真实的数据库中,每个过程有超过 200 个选项,并且数据库可能程序太多甚至会崩溃.
我已经阅读了 similar question 并且投票最多的答案是:
[...] a separate stored procedure for each operation is best. Otherwise you get too much logic inside your procedures.
但我的老师仍然坚持我应该换一种方式。我老师的论点是真的吗?
在单个存储过程中使用多个options/operations有什么优点?
有什么优点?可能 - 打开 Management Studio 可能会更快。
你老师错了吗?是的,当然可以,但正如 SMor 和 Jeroen 在评论中所写:你的老师负责评分,所以他是对的,直到你 class.
毕业
看看这个问题:Generic Stored Procedure for ALL the tables
如果您可以为每个 table 编写一个具有创建、读取、更新和删除的存储过程,那么为什么不为所有 table 构建一个具有 CRUD 操作的通用存储过程?一个数据库 - 一个存储过程。
现在,应用您将使用的逻辑来确定这对您的问题来说是个坏主意。
或应用 SOLID 原则 - 它们也适用于存储过程。您不会编写一个方法来根据输入参数执行 4 个截然不同的操作,对吗?
或在这里查看:If logic in stored proc。
第一次执行时 SQL 服务器将探索所有分支,并制定计划 - 但它将使用第一次执行时看到的参数。因此,假设您的第一次执行是插入 @IdCiudad = null,那么这就是 SQL 服务器将在选项 4 分支中优化的内容。
您的初始插入将构建一个 select 计划(对于选项 4),其中预期将返回所有行,这意味着内存授予太大,并且可能是一个带有哈希连接的并行计划要启动。
哦,还有
WHERE Foo = @foo OR @foo = 0 OR @foo IS NULL
SQL 服务器不知道如何对此进行优化。在此处查看 Aaron Bertrands 文章 Kitchen sink design pattern。
我正在处理我的数据库 class 期末项目,该项目包括制作一个可以访问数据库并在数据库中执行操作的应用程序。我的老师坚持认为我应该根据 table:
使用一个存储过程--In stored procedure "sp_Ciudades"
@Opcion int,
@IdCiudad int = NULL,
@IdEstado int = NULL,
@Nombre varchar(50) = NULL
AS
BEGIN
--Create new record
IF @Opcion = 1
BEGIN
INSERT INTO Ciudades
VALUES(@IdEstado, @Nombre)
END
--Delete record
IF @Opcion = 2
BEGIN
DELETE FROM Ciudades
WHERE IdCiudad = @IdCiudad
END
--Update city
IF @Opcion = 3
BEGIN
UPDATE Ciudades
SET IdEstado = @IdEstado
Nombre = @Nombre
WHERE IdCiudad = @IdCiudad
END
--Retrieve cities
IF @Opcion = 4
BEGIN
SELECT *
FROM Ciudades
WHERE IdCiudad = @IdCiudad OR @IdCiudad = 0 OR @Ciudad IS NULL
END
--Fill cities ComboBox
IF @Opcion = 5
BEGIN
SELECT IdCiudad, Nombre
FROM Ciudades
ORDER BY Nombre
END
END
另一方面,我尝试做这样的事情:
--In stored procedure "sp_Ciudades_Vista"
@IdCiudad int = NULL
AS
BEGIN
SELECT *
FROM Ciudades
WHERE IdCiudad = @IdCiudad OR @IdCiudad = 0 OR @IdCiudad IS NULL
ORDER BY ID
END
--In stored procedure "sp_Ciudades_Cambio"
@IdCiudad int,
@IdEstado int,
@Nombre varchar(50)
AS
BEGIN
UPDATE Ciudades
SET IdEstado = @IdEstado,
Nombre = @Nombre
WHERE IdCiudad = @IdCiudad
END
我觉得在我的应用程序中定义命令字符串时代码更有条理(和封装)并且更容易阅读和理解(使用数字选项我经常不得不返回过程定义才能看到每个数字的作用)。另外,我只使用了实现操作所需要的参数。
但是,我的老师说,如果我这样做,数据库将有太多的存储过程,因为 在真实的数据库中,每个过程有超过 200 个选项,并且数据库可能程序太多甚至会崩溃.
我已经阅读了 similar question 并且投票最多的答案是:
[...] a separate stored procedure for each operation is best. Otherwise you get too much logic inside your procedures.
但我的老师仍然坚持我应该换一种方式。我老师的论点是真的吗? 在单个存储过程中使用多个options/operations有什么优点?
有什么优点?可能 - 打开 Management Studio 可能会更快。
你老师错了吗?是的,当然可以,但正如 SMor 和 Jeroen 在评论中所写:你的老师负责评分,所以他是对的,直到你 class.
毕业看看这个问题:Generic Stored Procedure for ALL the tables
如果您可以为每个 table 编写一个具有创建、读取、更新和删除的存储过程,那么为什么不为所有 table 构建一个具有 CRUD 操作的通用存储过程?一个数据库 - 一个存储过程。
现在,应用您将使用的逻辑来确定这对您的问题来说是个坏主意。
或应用 SOLID 原则 - 它们也适用于存储过程。您不会编写一个方法来根据输入参数执行 4 个截然不同的操作,对吗?
或在这里查看:If logic in stored proc。
第一次执行时 SQL 服务器将探索所有分支,并制定计划 - 但它将使用第一次执行时看到的参数。因此,假设您的第一次执行是插入 @IdCiudad = null,那么这就是 SQL 服务器将在选项 4 分支中优化的内容。
您的初始插入将构建一个 select 计划(对于选项 4),其中预期将返回所有行,这意味着内存授予太大,并且可能是一个带有哈希连接的并行计划要启动。
哦,还有
WHERE Foo = @foo OR @foo = 0 OR @foo IS NULL
SQL 服务器不知道如何对此进行优化。在此处查看 Aaron Bertrands 文章 Kitchen sink design pattern。