Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Passer des paramètres dynamiques à une procédure stockée dans SQL Server 2008

L'intérêt de votre procédure wrapper n'est pas vraiment clair (audit ? débogage ?), et cela semble être une solution très délicate. Si vous expliquez pourquoi vous voulez faire cela, quelqu'un peut avoir une solution complètement différente et, espérons-le, meilleure.

Le plus gros problème avec votre proposition est que vous ne pouvez transmettre des paramètres que sous forme de chaînes, ce qui signifie que vous devez gérer tous les problèmes d'échappement, de conversion/formatage des données et d'injection SQL qui accompagnent SQL dynamique . Il serait bien préférable d'appeler chaque procédure directement, en passant des paramètres correctement typés à partir de votre code d'appel.

Cela dit, si vous voulez vraiment le faire, vous pouvez faire quelque chose comme ceci :

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

Vous devriez également jeter un œil à sp_executesql , qui fait presque exactement ce que vous voulez, mais il doit également avoir tous les types de données de paramètre, ce qui, selon vous, n'est pas possible dans votre scénario.