it-swarm.com.de

Parameter für gespeicherte Prozeduren von SQL Server

Ich entwickle ein Framework, in dem ich eine aufrufende gespeicherte Prozedur mit dynamisch erstellten Parametern bin. Ich baue die Parametersammlung zur Laufzeit. 

Das Problem tritt auf, wenn ich einen Parameter an eine gespeicherte Prozedur übergeben habe, die gespeicherte Prozedur diesen Parameter jedoch nicht akzeptiert.

Meine gespeicherte Prozedur lautet beispielsweise:

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50)
AS
BEGIN
-- SP Logic
END

Gespeicherte Prozedur aufrufen als:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2

Dies wirft den folgenden Fehler aus:

Msg 8144, Level 16, State 2, Procedure GetTaskEvents, Line 0
Procedure or function GetTaskEvents has too many arguments specified.

Dies funktioniert gut in Sybase ASE, wobei zusätzliche Parameter einfach ignoriert werden. Konnte dies mit dem MSSQL Server 2008 erreicht werden? Jede Hilfe, sehr geschätzt. Vielen Dank

26
Narayan Akhade

Warum übergeben Sie einen Parameter an eine gespeicherte Prozedur, die ihn nicht verwendet? 

Es scheint mir, als ob Sie dynamische SQL-Anweisungen besser erstellen und dann ausführen könnten. Was Sie mit dem SP versuchen, funktioniert nicht, und selbst wenn Sie das ändern können, was Sie tun, um eine unterschiedliche Anzahl von Parametern zu berücksichtigen, würden Sie im Grunde dynamisch generiertes SQL verwenden, das Sie verwenden den Zweck der Verwendung/Verwendung eines SP an erster Stelle zu vereiteln. SPs haben eine Rolle, aber es gibt nicht in allen Fällen die Lösung.

7
E.J. Brennan

SQL Server erlaubt Ihnen nicht, Parameter an eine Prozedur zu übergeben, die Sie nicht definiert haben. Ich denke, dass Sie dieser Art von Design am nächsten kommen können, ist die Verwendung optionaler Parameter wie folgt:

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50),
    @ID int = NULL
AS
BEGIN
-- SP Logic
END;

Sie müssen jeden möglichen Parameter angeben, den Sie möglicherweise in der Definition verwenden. Dann können Sie die Prozedur in beliebiger Weise aufrufen:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2;
EXEC GetTaskEvents @TaskName = 'TESTTASK'; -- @ID gets NULL here
37
Yuck

Ich gehe hier ein wenig von der Annahme aus, aber ich gehe davon aus, dass die Logik innerhalb der Prozedur per Task aufgeteilt wird. Und Sie können wegen der Dynamik der Parameter keine nullwertfähigen Parameter wie @Yuck haben? 

Also von meiner Annahme ausgehen

Wenn TaskName = "Path1", dann etwas

Wenn TaskName = "Path2", dann etwas anderes

Mein erster Gedanke ist, wenn Sie separate Funktionen mit Geschäftslogik haben, die Sie erstellen müssen, und Sie können feststellen, dass Sie 5-10 verschiedene Szenarien haben. Schreiben Sie stattdessen einzelne gespeicherte Prozeduren, anstatt eine riesige Lösung für alle zu versuchen Ansatz. Könnte ein bisschen chaotisch werden.

Aber wenn du musst ...

Warum nicht dynamisches SQL ausprobieren, wie von @EJ Brennan vorgeschlagen (verzeihen Sie sich, ich habe SQL seit einiger Zeit nicht mehr berührt, so dass meine Syntax möglicherweise rostig ist). Aber könnte dies möglicherweise Ihren Bedürfnissen entsprechen?

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50)
    @Values varchar(200)
AS
BEGIN
  DECLARE @SQL VARCHAR(MAX)

  IF @TaskName = 'Something'
  BEGIN
    @SQL = 'INSERT INTO.....' + CHAR(13)
    @SQL += @Values + CHAR(13) 
  END

  IF @TaskName = 'Something Else'
  BEGIN
    @SQL = 'DELETE SOMETHING WHERE' + CHAR(13)
    @SQL += @Values + CHAR(13) 
  END

  PRINT(@SQL)
  EXEC(@SQL)    
END

(Der CHAR (13) fügt eine neue Zeile hinzu. Ein alter Habbit, den ich irgendwo gefunden habe, um das Debuggen und Lesen dynamischer Prozeduren zu unterstützen Beim Ausführen von SQL Profiler.)

3
Rohan Büchner
CREATE PROCEDURE GetTaskEvents
@TaskName varchar(50),
@Id INT
AS
BEGIN
-- SP Logic
END

Prozedur aufrufen 

DECLARE @return_value nvarchar(50)

EXEC  @return_value = GetTaskEvents
        @TaskName = 'TaskName',
        @Id =2  

SELECT  'Return Value' = @return_value
1
Ad Kahn

Sie analysieren eine falsche Parameterkombination. Hier übergeben Sie @TaskName = und @ID anstelle von @TaskName = .SP nur einen Parameter.

0
CodeMind