web-dev-qa-db-fra.com

Paramètres de procédure stockée SQL Server

Je développe un framework, dans lequel je suis une procédure stockée appelante avec des paramètres créés dynamiquement. Je construis une collection de paramètres au moment de l'exécution. 

Le problème se produit lorsque je passe un paramètre à une procédure stockée, mais la procédure stockée n'accepte pas un tel paramètre.

Par exemple, ma procédure stockée est:

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

Appel de procédure stockée en tant que:

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

Cela jette l'erreur ci-dessous:

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

Cela fonctionne très bien dans Sybase ASE, qui ignore tout paramètre supplémentaire. Cela pourrait-il être réalisé avec MSSQL Server 2008? Toute aide, très appréciée. Merci

26
Narayan Akhade

Pourquoi voudriez-vous passer un paramètre à une procédure stockée qui ne l'utilise pas? 

Il me semble que vous feriez mieux de construire des instructions SQL dynamiques, puis de les exécuter. Ce que vous essayez de faire avec SP ne fonctionnera pas, et même si vous pouviez changer ce que vous faites de manière à prendre en charge un nombre variable de paramètres, vous utiliseriez alors essentiellement du SQL généré dynamiquement vider l'objectif d'avoir/d'utiliser un SP en premier lieu. Les SP ont un rôle à jouer, mais il n'y a pas de solution dans tous les cas.

7
E.J. Brennan

SQL Server ne vous permet pas de passer des paramètres à une procédure que vous n'avez pas définie. Je pense que le plus proche de ce type de conception est d'utiliser des paramètres optionnels comme ceci:

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

Vous devrez inclure tous les paramètres possibles que vous pourriez utiliser dans la définition. Ensuite, vous seriez libre d'appeler la procédure de l'une ou l'autre manière:

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

Je pars du principe d’une hypothèse, mais je suppose que la logique de la procédure est scindée en tâches. Et vous ne pouvez pas avoir de paramètres nullables comme @Yuck suggéré en raison de la dynamique des paramètres? 

Donc, aller par mon hypothèse

Si TaskName = "Path1" alors quelque chose

Si TaskName = "Path2", alors quelque chose d'autre

Ma pensée initiale est la suivante: si vous avez des fonctions distinctes avec la logique métier que vous devez créer, et que vous pouvez déterminer que vous avez défini 5 à 10 scénarios différents, écrivez plutôt des procédures stockées individuelles selon vos besoins, au lieu d'essayer une solution unique qui convient à tous. approche. Peut-être un peu compliqué à entretenir.

Mais si tu dois ...

Pourquoi ne pas essayer le SQL dynamique, comme suggéré par @EJ Brennan (Pardonnez-moi, je n’ai pas touché à SQL depuis un moment, donc ma syntaxe pourrait être rouillée) Cela dit, je ne sais pas si c’est la meilleure approche, mais cela pourrait-il éventuellement répondre à vos besoins?

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

(Le CHAR (13) ajoute une nouvelle ligne. Un vieil habbit que j’ai ramassé quelque part, utilisé pour aider au débogage/à la lecture des procédures dynamiques Lors de l’exécution du profileur SQL.)

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

Procédure d'appel 

DECLARE @return_value nvarchar(50)

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

SELECT  'Return Value' = @return_value
1
Ad Kahn

Vous analysez une mauvaise combinaison de paramètres. Si vous passez @TaskName = et @ID au lieu de @TaskName = .SP n’a besoin que d’un paramètre.

0
CodeMind