Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Übergeben dynamischer Parameter an eine gespeicherte Prozedur in SQL Server 2008

Es ist nicht wirklich klar, was der Zweck Ihrer Wrapper-Prozedur ist (Prüfung? Debugging?), und es scheint eine sehr umständliche Lösung zu sein. Wenn Sie erklären, warum Sie dies tun möchten, hat jemand vielleicht eine ganz andere und hoffentlich bessere Lösung.

Das größte Problem bei Ihrem Vorschlag ist, dass Sie Parameter nur als Zeichenfolgen übergeben können, und das bedeutet, dass Sie alle Probleme mit Escaping, Datenkonvertierung/-formatierung und SQL-Einschleusung behandeln müssen, die mit dynamisches SQL . Es wäre viel besser, jede Prozedur direkt aufzurufen und korrekt typisierte Parameter aus Ihrem aufrufenden Code zu übergeben.

Abgesehen davon, wenn Sie es wirklich wollen, können Sie so etwas tun:

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

Sie sollten sich auch sp_executesql , das fast genau das tut, was Sie wollen, aber es muss auch alle Parameterdatentypen haben, was Ihrer Meinung nach in Ihrem Szenario nicht möglich ist.