-1

Aus irgendeinem Grund kann ich die Syntax nicht richtig für diese gespeicherte Prozedur abrufen. Ich habe 2 Variablen. Das Problem ist das - Wenn wir die gespeicherte Prozedur ausführen, muss der Benutzer möglicherweise 1 Ganzzahl für einen Parameter, mehrere oder keine liefern. Ich möchte dem Benutzer in diesem Verfahren alle Optionen für beide Parameter erlauben. Unten ist das, was ich gerade habe. Ich probiere verschiedene Methoden aus, und es scheint, dass dies einfach zu lösen sein sollte.IF ELSE in Stored Procedure - Syntax Problem?

Im Moment scheint es nicht die ELSE zu mögen. Ich bekomme eine falsche Syntax in der Nähe des Wortes 'ELSE'. Wenn ich diese herausnehme, erhalte ich Ergebnisfenster für alle 4 Abfragen, obwohl nur eine dieser IFs wahr sein kann.

Kann jemand helfen?

ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB 
@BID VARCHAR = NULL, @LID VARCHAR = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

    --DECLARE @BID VARCHAR 
    --, @LID VARCHAR 
    --SET @BID = '301,316,373,322,331' 
    ----'301,316,373,322,331' 
    --SET @LID = '1' 
    ----'1,2,3,4' 

    IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') = '' 
     PRINT 'BOTH NULL' 
     BEGIN 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
     END 
    ELSE 
     IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') <> '' 
      PRINT 'LID NULL' 
      BEGIN 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.LID IN (@LID) 
      END 
    ELSE   
     IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = '' 
      PRINT 'BID NULL' 
      BEGIN 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.BID IN (@BID) 
      END 
    ELSE 
    --IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> '' 
     PRINT 'NEITHER NULL' 
     BEGIN 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
      WHERE VWPD.LID IN (@LID) AND VWPD.BID IN (@BID) 

     END 
END 
GO 

--EXEC sp_ProjectDocs_AuditDB_ByLB '301','1' 

GO 

SQL aktualisiert, wie durch Fragen arbeiten. Dies scheint zu laufen, aber ich bekomme keine Ergebnisse, wenn ich dies verifizieren kann, indem ich dieselben Parameter direkt an die Ansicht in den Select-Anweisungen übergebe.

ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB 
@BID VARCHAR = NULL, @LID VARCHAR = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

    --DECLARE @BID VARCHAR(100) 
    --, @LID VARCHAR 
    --SET @BID = '301,316,373,322,331' 
    ----'301,316,373,322,331' 
    --SET @LID = '1' 
    ----'1,2,3,4' 

    IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') = '' 
     BEGIN 
      --PRINT 'BOTH NULL' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
     END 
    ELSE 
     IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') <> '' 
      BEGIN 
       --PRINT 'BID NULL' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.LID IN (@LID) 
      END 
    ELSE   
     IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = '' 
      BEGIN 
       --PRINT 'LID NULL' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.BID IN (@BID) 
      END 
    ELSE 
    --IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> '' 
     BEGIN 
      --PRINT 'NEITHER NULL' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
      WHERE VWPD.BID IN (@BID) AND VWPD.LID IN (@LID) 

     END 
END 
GO 

--EXEC sp_ProjectDocs_AuditDB_ByLB '301','1' 

GO 
+0

Abgesehen von den logischen Fehlern sollten Sie Ihre Prozedur umbenennen. Das Präfix sp_ kann zu einigen Leistungsproblemen führen. Ändern Sie entweder das Präfix, oder ich bevorzuge es, das Präfix einfach ganz zu löschen. http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+3

Ich bemerkte ein paar andere mögliche Probleme hier. Sie haben Varchars übergeben, aber die Größe nicht angegeben. Das heißt, sie werden standardmäßig auf 30 gesetzt. Es ist im Allgemeinen am besten, explizit zu sein. Das größere Problem ist jedoch, dass Sie diese Varchar-Werte mit einem IN-Prädikat verwenden. Wenn Sie mehrere Werte übergeben, die nicht funktionieren. Außerdem besteht bei diesem Verfahren ein potenzielles Leistungsproblem, da der Ausführungsplan leicht verwirrt werden kann, wenn die resultierende Abfrage jede Ausführung ändert. http://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/ fwiw, ich war nicht derjenige, der Sie heruntergestuft –

+0

Vielen Dank, Sean! Dieser Standard-Varchar war Teil meines Problems. Jetzt muss ich nur feststellen, ob ich mehr als 1 Zahl für einen Parameter übergebe, also kann ich sie als eine Mehrfachliste an die IN WHERE-Klausel übergeben. hmm .... Ich habe eine Idee! – missscripty

Antwort

2

Versuchen Sie dieses, Sie haben die Print Anweisung innerhalb der Begin-End-Block zu geben.

ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB 
@BID VARCHAR = NULL, @LID VARCHAR = NULL 
AS 
BEGIN 
    declare @sqlquery varchar(max) 

    SET NOCOUNT ON 

    --DECLARE @BID VARCHAR 
    --, @LID VARCHAR 
    --SET @BID = '301,316,373,322,331' 
    ----'301,316,373,322,331' 
    --SET @LID = '1' 
    ----'1,2,3,4' 

    IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') = '' 

     BEGIN 
     set @sqlquery = ' 
     PRINT ''BOTH NULL'' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD' 
     END 
    ELSE 
     IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') <> '' 

      BEGIN 
      set @sqlquery = ' 
      PRINT ''LID NULL'' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.LID IN(' + @LID+')' 
      END 
    ELSE   
     IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = '' 

      BEGIN 
      set @sqlquery = ' 
      PRINT ''BID NULL'' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.BID IN ('+ @BID+')' 
      END 
    ELSE 
    --IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> '' 

     BEGIN 
     set @sqlquery = ' 
     PRINT ''NEITHER NULL'' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
      WHERE VWPD.LID IN ('[email protected]+') AND VWPD.BID IN ('[email protected]+')' 

     END 
    EXEC (@sqlquery) 
END 
GO 
+0

dies bringt mich die sonst Fehler, aber jetzt bekomme ich keine Ergebnisse, mit der Nachricht, die mir die richtige 'weder null'. Ich kann die Ansicht direkt abfragen, mit den Parametern, die ich getestet habe (bid = 301, lid = 1) und ich bekomme 10 Ergebnisse (was ich sollte). aber Ausführung von dem gespeicherten Proc, bekomme ich 0 Ergebnisse. Irgendwelche Gedanken? – missscripty

+0

Können Sie PRINT durch SELECT ersetzen und versuchen Sie es erneut – DineshDB

+0

Meinst du, vor oder PRINT SELECT ....? – missscripty

3

Sie haben PRINT innerhalb BEGIN/END Block zu setzen.

Bitte beachten Sie, dass die Nachrichten 'LID NULL' und 'BID NULL' nicht korrekt sind basierend auf Ihrer IF.

1

Hier ist die letzte, funktionierende gespeicherte Prozedur.

ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB 
@BID NVARCHAR(500) = NULL, @LID NVARCHAR(500) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

    --DECLARE @BID NVARCHAR(500) 
    --, @LID NVARCHAR(500) 
    --SET @BID = '301,316,373,322,331' 
    ----'301,316,373,322,331' 
    --SET @LID = '1' 
    ----'1,2,3,4' 


    IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') = '' 
     BEGIN 
      --PRINT 'BOTH NULL' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
     END 
    ELSE 
     IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') <> '' 
      BEGIN 
       --PRINT 'BID NULL' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.LID IN (SELECT * FROM SPLIT(@LID, ',')) 
      END 
    ELSE   
     IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = '' 
      BEGIN 
       --PRINT 'LID NULL' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.BID IN (SELECT * FROM SPLIT(@BID, ',')) 
      END 
    ELSE 
    --IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> '' 
     BEGIN 
      --PRINT 'NEITHER NULL' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
      WHERE VWPD.BID IN (SELECT * FROM SPLIT(@BID, ',')) AND VWPD.LID IN (SELECT * FROM SPLIT(@LID, ',')) 

     END 
END 
GO 

--EXEC sp_ProjectDocs_AuditDB_ByLB '301','1' 

GO