Home > Back-end >  Are there any advantages in using a single stored procedure for multiple operations or is my teacher
Are there any advantages in using a single stored procedure for multiple operations or is my teacher

Time:05-18

I'm working on my databases class final project, which consists of making an application that can access and do operations in a database. My teacher insists that I should use a single stored procedure per 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

On the other hand I tried to do something like this:

--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

I feel the code is much more organized (and encapsulated) and easier to read and understand when defining the command strings in my application (with the numeric options I constantly have to go back to the procedure definition in order to see what each number does). Also, I only use the parameters that are needed to achieve the operation.

However, my teacher says that if I do it this way, the database will have way too many stored procedures since in a real database, there are over 200 options per procedure, and the database may even crash if there's too many procedures in it.

I have already read a similar question and the most voted answer states that:

[...] a separate stored procedure for each operation is best. Otherwise you get too much logic inside your procedures.

But my teacher still insists I should be doing it the other way. Is my teacher's argument true? What are the advantages of having multiple options/operations inside a single stored procedure?

CodePudding user response:

Are there any advantages? Probably - opening Management Studio could be quicker.

Is your teacher wrong? Yes, most certainly, but as SMor and Jeroen write in the comments: Your teacher does the grading, so he's right until you graduate your class.

Take a look at this question: Generic Stored Procedure for ALL the tables

If you could write a single stored procedure for each table with Create, Read, Update and Delete, then why not build a single generic stored procedure with CRUD operations for ALL the tables? One database - One stored procedure.

Now, apply the logic you would use to determine that this is a bad idea to your problem.

Or apply SOLID principles - they apply to stored procedures as well. You wouldn't write a single method to do 4 wildly different operations based on an input parameter, would you?

Or have a look here: If logic in stored proc.

On first execution SQL Server will explore all the branches, and build a plan - but it will use the parameters seen at that first execution. So assume your first execution is an insert with @IdCiudad = null, then that's what SQL Server will optimize for in the option 4 branch.

Your initial insert will build a select plan (for option 4) where all rows are expected to be returned, meaning a too large memory grant and maybe a parallel plan with hash joins to boot.

Oh, and

WHERE Foo = @foo OR @foo = 0 OR @foo IS NULL

SQL Server won't know how to optimize for this. See Aaron Bertrands article here Kitchen sink design pattern.

CodePudding user response:

This approach violates the Single Responsibility Principle(SRP from SOLID). That not cool(

  • Related