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

Pasar parámetros dinámicos a un procedimiento almacenado en SQL Server 2008

No está realmente claro cuál es el punto de su procedimiento de contenedor (¿auditoría? ¿Depuración?), Y parece una solución muy incómoda. Si explica por qué quiere hacer esto, alguien puede tener una solución completamente diferente y, con suerte, mejor.

El mayor problema con su propuesta es que solo puede pasar parámetros como cadenas y eso significa que tiene que manejar todos los problemas de escape, conversión/formato de datos e inyección SQL que vienen con SQL dinámico . Sería mucho mejor llamar a cada procedimiento directamente, pasando los parámetros escritos correctamente desde su código de llamada.

Habiendo dicho todo eso, si realmente quieres hacerlo, entonces puedes hacer algo como esto:

create proc dbo.ExecuteProcedure
    @ProcedureName sysname,
    @Parameters nvarchar(max),
    @Debug bit = 0x0,
    @Execute bit = 0x1
as
set nocount on
begin

declare @sql nvarchar(max)
set @sql = 'exec ' + quotename(@ProcedureName) + ' ' + @Parameters

if @Debug = 0x1 print @sql

if @Execute = 0x1 exec(@sql)

end
go

exec dbo.ExecuteProcedure 'dbo.SomeProc', '@p1 = 1, @p2 = ''themhz''s proc''', 0x1, 0x0

También debería echar un vistazo a sp_executesql , que hace casi exactamente lo que desea, pero también debe tener todos los tipos de datos de parámetros, lo que dice que no es posible en su escenario.