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
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 –
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 –
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