Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Passando parâmetros dinâmicos para um procedimento armazenado no SQL Server 2008


Não está muito claro qual é o objetivo do seu procedimento de wrapper (auditoria? depuração?), e parece uma solução muito complicada. Se você explicar por que deseja fazer isso, alguém pode ter uma solução completamente diferente e, esperançosamente, melhor.

O maior problema com sua proposta é que você só pode passar parâmetros como strings e isso significa que você precisa lidar com todos os problemas de escape, conversão/formatação de dados e injeção de SQL que vêm com SQL dinâmico . Seria muito melhor chamar cada procedimento diretamente, passando parâmetros digitados corretamente de seu código de chamada.

Dito tudo isso, se você realmente quiser fazer isso, pode fazer algo assim:
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

Você também deve dar uma olhada em sp_executesql , que faz quase exatamente o que você deseja, mas também precisa ter todos os tipos de dados de parâmetro, o que você diz não ser possível em seu cenário.