Ich bin mit SQL Server 2008.Warum führt meine gespeicherte Prozedur alle Auswahlvorgänge unabhängig von der Bedingungslogik aus?
Ich habe ein interessantes Szenario, in dem eine gespeicherte Prozedur (durch einen „Power-User“ geschrieben) eine okaye Laufzeit (ca. 4 Sekunden) hat, wenn es Daten ist in der Primärtabelle. Wenn der Suchwert nicht vorhanden ist, beträgt die durchschnittliche Laufzeit etwa 3 Minuten. Aufgrund der Funktionsweise des Prozesses und der Webanwendung, die die Prozedur verwendet, ist bei fehlenden Daten eine leere Ergebnismenge erforderlich.
Ich habe die Logik unten mit Werten getestet, die Daten und Werte haben, die nicht und der Fluss scheint zu funktionieren; Wenn ich jedoch meine eigentliche Abfrage in die else-Anweisung lege, scheint es, als ob dieser Teil immer ausgewertet wird, obwohl ich weiß, dass die logische Verzweigung nicht ausgeführt werden sollte.
DECLARE @spId int
SELECT @spId = td.mainId
FROM dbo.PRIMARYTABLE
WHERE td.longId = @searchVal
IF @spId < 1 OR @spId IS NULL
BEGIN
select 'RETURN EMPTY RESULT SET' as test
END
ELSE
BEGIN
SELECT 'DO ACTUAL QUERY' as test
END
Wenn ich teste dies mit einem Blindwert, wie beispielsweise 1111, das select 'RETURN RESULT SET EMPTY' als Testzurückgeführt wird. Wenn ich einen Wert verwende, von dem ich weiß, dass er existiert, wird die SELECT 'DO ACTUAL QUERY' als Test zurückgegeben. Wenn ich "SELECT 'DO ACTUAL QUERY' als Test" mit der eigentlichen Heavy-Duty-Abfrage ersetze und den gleichen nicht vorhandenen Dummy-Wert verwende, sieht es immer noch so aus, als wäre die ELSE-Klausel erreicht.
Was fehlt mir hier?
Sie sagten "sieht so aus", also sind Sie sich nicht sicher? Was ist Ihre "Heavy Duty" -Abfrage? Der von Ihnen gepostete Code ist nicht vollständig (z. B. fehlender Alias, Variablendeklaration), sodass Sie möglicherweise etwas anderes mit Ihrer "Heavy Duty" -Abfrage machen.I ** bezweifle, dass du die ELSE-Klausel mit nicht zufriedenstellenden Kriterien getroffen hast –
Die "Heavy Duty" -Abfrage ist eine Ungeheuerlichkeit, bei der Casts, Round & IsNulls für eine Reihe von Berechnungen verwendet wurden. Ich weiß nicht, ob es eine gespeicherte Sql-Server-Prozedur-Mechanik gibt, mit der ich nicht vertraut bin, aber in meinen Tests erschien die if/else-Bedingungslogik einwandfrei; Es scheint jedoch immer noch so, als würde der else-Teil aufgerufen, wenn er aus dem Code heraus ausgeführt wird (entweder über sql management studio oder asp.net mvc web application). – jason
nur "leicht" ersetzen Mit "havy duty" wählen würde man den IF ... ELSE-Ablauf nicht ändern. Es ist sehr wahrscheinlich, dass Ihre IF-Bedingung (gelesene @ spId-Variable) einen "unerwarteten Wert" erhält. Nikolas Antwort kann Ihnen einen guten Ausgangspunkt bieten. ** Das letzte Ding ** wäre zu denken, dass mit * @ spId <1 oder null * du irgendwie ELSE Block schlagen kannst. –