sql >> Base de Datos >  >> RDS >> Sqlserver

¿Podemos escribir una subfunción o procedimiento dentro de otro procedimiento almacenado?

No recomiendo hacer esto ya que cada vez que se crea se debe calcular un nuevo plan de ejecución, pero SÍ, definitivamente se puede hacer (Todo es posible, pero no siempre recomendable).

Aquí hay un ejemplo:

CREATE PROC [dbo].[sp_helloworld]
AS
BEGIN
    SELECT 'Hello World'
    DECLARE @sSQL VARCHAR(1000)
    SET @sSQL = 'CREATE PROC [dbo].[sp_helloworld2]
            AS
            BEGIN
                SELECT ''Hello World 2''
            END'
    EXEC (@sSQL)

    EXEC [sp_helloworld2];
    DROP PROC [sp_helloworld2];
END

Recibirás la advertencia

The module 'sp_helloworld' depends on the missing object 'sp_helloworld2'.
The module will still be created; however, it cannot run successfully until
the object exists.

Puede omitir esta advertencia utilizando EXEC('sp_helloworld2') arriba.

Pero si llama a EXEC [sp_helloworld] obtendrá los resultados

Hello World
Hello World 2