Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Passaggio di parametri dinamici a una stored procedure in SQL Server 2008

Non è molto chiaro quale sia lo scopo della tua procedura wrapper (auditing? debugging?) E sembra una soluzione molto imbarazzante. Se spieghi perché vuoi farlo, qualcuno potrebbe avere una soluzione completamente diversa e, si spera, migliore.

Il problema più grande con la tua proposta è che puoi passare parametri solo come stringhe e ciò significa che devi gestire tutti i problemi di escaping, conversione/formattazione dei dati e SQL injection che vengono con SQL dinamico . Sarebbe molto meglio chiamare direttamente ciascuna procedura, passando i parametri digitati correttamente dal codice chiamante.

Detto questo, se vuoi davvero farlo, puoi fare qualcosa del genere:

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

Dovresti anche dare un'occhiata a sp_executesql , che fa quasi esattamente quello che vuoi, ma deve avere anche tutti i tipi di dati dei parametri, cosa che secondo te non è possibile nel tuo scenario.