2012-03-29 10 views
2

Ich habe diese Prozedur, die eine andere Prozedur ausführt, die von einem Parameter und seinen Parametern datefrom und dateto übergeben wird.Übergeben von dynamischen Parametern an eine gespeicherte Prozedur in SQL Server 2008

CREATE procedure [dbo].[execute_proc] 
@procs varchar(200), 
@pdatefrom date, 
@pdateto date 
as 

exec @procs @[email protected],@[email protected] 

Aber ich muss auch die Parameter dynamisch übergeben, ohne sie in der Prozedur bearbeiten zu müssen. Zum Beispiel, was ich ist mir vor so etwas wie dieses

CREATE procedure [dbo].[execute_proc] 
    @procs varchar(200), 
    @params varchar(max) 
as 
    exec @procs @params 

wo @params ist eine Zeichenkette wie @param1=1,@param2='somethingelse'

Gibt es eine Möglichkeit, dies zu tun?

+0

besuchen Sie diesen Link: http://www.sqlteam.com/article/stored-procedures-parameters-inserts-and-updates –

+0

Was genau versuchen Sie zu erreichen? Wenn Sie nicht wissen, welche Parameter an die Prozedur übergeben werden, wie können Sie sie im Prozedurcode verwenden? – Pondlife

+0

hmm ich glaube nicht, dass es meine Frage beantwortet :( – themis

Antwort

5

Es ist nicht wirklich klar, was der Punkt Ihrer Wrapper-Prozedur ist (Auditing? Debugging?), Und es scheint wie eine sehr peinliche Lösung. Wenn Sie erklären, warum Sie dies tun wollen, kann jemand eine völlig andere und hoffentlich bessere Lösung haben.

Das größte Problem mit Ihrem Vorschlag ist, dass Sie nur Parameter als Zeichenfolgen übergeben können, und das bedeutet, dass Sie alle Probleme umgehen, Datenkonvertierung/Formatierung und SQL-Injektion mit dynamic SQL umgehen müssen. Es wäre viel besser, jede Prozedur direkt aufzurufen und korrekt eingegebene Parameter von Ihrem aufrufenden Code zu übergeben.

alles, was gesagt haben, wenn Sie es wirklich tun wollen, dann sind Sie so etwas tun kann:

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 auch einen Blick auf sp_executesql haben sollte, die fast genau das tut, was Sie wollen, aber es benötigt auch alle Parameterdatentypen, die in Ihrem Szenario nicht möglich sind.

+0

Ok, danke für deine Zeit, das war der alte Weg, ich akzeptiere deine Antwort, weil es scheint, dass es noch keinen anderen Weg gibt und der einzige Weg ist die Art, wie du trotz der Sicherheitsprobleme vorschlägst. – themis

0
  1. Setzen Sie den Namen der gespeicherten Prozedur in einem varchar Feld in der Client-Tabelle
  2. den SP-Namen abrufen und weisen Sie auf einen Parameter (Servicepunktnamen), wenn der Client ausgewählt wird.
  3. In Code erstellen eine Funktion, die eine Zeichenfolge

    Funktion PassStoredProcedureName (Servicepunktname als String) als String

    Rückkehr Servicepunktname

    Ende Funktion

  4. Ihr Datensatz „Stored Procedure zurückgibt "

  5. Öffnen eines Datasets Ausdruckfenster
  6. Enter = Code.PassStoredProcedureName (Parameters! SpName.value)

Wenn Sie einen Client wählen, wird die Servicepunktname dem Parameter zugeordnet werden. Wenn das Dataset ausgeführt wird, übergibt es den Parameter an die Funktion, die den SpName an das Dataset weitergibt.

Ich verwende dies, um benutzerdefinierte gespeicherte Prozeduren für Clients auszuführen, wenn die gleiche gespeicherte Prozedur nicht für alle Clients funktioniert.

Achten Sie darauf, die Alias-Feldnamen zu normalisieren, damit die Datenabfrage für einen Bericht nicht unterbrochen wird.

Ihre gespeicherten Prozeduren sollten immer die gleichen Parameteranforderungen haben, auch wenn sie nicht benötigt werden.

Verwandte Themen