2009-10-13 8 views
31

Ich brauche meinen T-SQL Stored Procedure (MS SQL 2008) Steuerfluss zu einer Reihe von Richtungen verzweigen:Kontrollfluss in T-SQL SP mit IF..ELSE IF - gibt es andere Möglichkeiten?

CREATE PROCEDURE [fooBar] 
    @inputParam INT 
AS 
BEGIN 
    IF @inputParam = 1 
    BEGIN 
    ... 
    END 
    ELSE IF @inputParam = 3 
    BEGIN 
    ... 
    END 
    ELSE IF @inputParam = 3 
    BEGIN 
    ... 
    END 
END 

Gibt es noch andere Möglichkeiten? Zum Beispiel, in C# sollte ich switch-case Block verwenden.

+0

Das BEGIN/END ist nicht notwendig, es sei denn, Sie machen mehrere Dinge in diesem Teil der Entscheidungslogik. –

+0

@rexem: Ja, ich weiß. Ich habe absichtlich geschrieben, weil jeder Block eine Menge Code – abatishchev

+11

@rexem enthält, immer wenn ich das Anfang Ende ausließ, bereute ich es später in der Wartung, als jemand vergaß, sie hinzuzufügen, als sie einen zweiten Schritt dem Zweig des IF hinzufügten. Ich benutze sie jetzt immer. – HLGEM

Antwort

29

IF ... ELSE ... ist so ziemlich das, was wir in T-SQL haben. Es gibt nichts wie die CASE-Anweisung der strukturierten Programmierung. Wenn Sie einen erweiterten Satz von ... ELSE IF ... s haben, sollten Sie sicherstellen, dass BEGIN ... END für jeden Block enthalten ist, damit alles klar bleibt, und denken Sie immer daran, dass konsistenter Einzug Ihr Freund ist!

+14

Ich schreibe immer meine IFS und beginne und beende, bevor ich den Code schreibe, der zwischen dem Anfang und dem Ende geht, speichert eine ganze Menge von Debugging später, um den Beginn zu beenden, endet vor jedem Code, der dazwischen geht. – HLGEM

+3

Darn richtig macht es. –

+0

gibt es Case-Anweisungen in T-SQL – shradha

-1
CASE expression 
     WHEN value1 THEN result1 
     WHEN value2 THEN result2 
     ... 
     WHEN valueN THEN resultN 

     [ 
     ELSE elseResult 
     ] 
END 

http://www.4guysfromrolla.com/webtech/102704-1.shtml Für weitere Informationen.

+1

Dies gilt nur für Abfragen. Ich muss alles innerhalb Block schreiben, d. H. Viele Codezeilen mit verschiedenen Abfragen und SP-Aufrufen – abatishchev

+12

In T-SQL CASe ist ein ** EXPRESSION ** kein Kontrollzweig. Sehr unterschiedliche Bestien. –

+0

Dies ist außerhalb des SELECT-Anweisungskontexts. – hoggar

1

Nein IF ist der Weg zu gehen, was ist das Problem, das Sie mit der Verwendung haben?

BTW Ihr Beispiel wird nicht immer auf den dritten Block von Code, wie es und der zweite Block sind genau gleich.

+0

Ja, das ist was ich brauche ^) – abatishchev

8

Nein, aber Sie sollten vorsichtig sein, wenn Sie IF ... ELSE ... END IF in gespeicherten Procs verwenden. Wenn sich Ihre Codeblöcke radikal unterscheiden, können Sie unter einer schlechten Leistung leiden, da der Prozessplan jedes Mal neu zwischengespeichert werden muss. Wenn es sich um ein Hochleistungssystem handelt, möchten Sie möglicherweise separate gespeicherte Prozeduren für jeden Codeblock kompilieren und Ihre Anwendung entscheiden lassen, welcher Prozess zum richtigen Zeitpunkt aufgerufen werden soll.

+0

Das ist sehr wahr. Aber wenn die Verzweigung nur innerhalb der Prozedur stattfinden kann (im Gegensatz zu der Anwendung, die eine von mehreren Prozeduren aufruft), stecken Sie immer noch mit einer Reihe von IF-Anweisungen fest. –

+0

Mein Proc-Name [execOperation] hat von ASP.NET FormView mit Parameter aus Dropdown-Liste aufgerufen, die eine Liste von möglichen Operationstypen enthält. So habe ich leider keine Möglichkeit, eine Anzahl von separaten Procs zu haben – abatishchev

13

Auch Sie können versuchen, Ihre Antwort in Form einer SELECT CASE Anweisung zu formulieren. Sie können dann später einfach erstellen, wenn dann Ihre Ergebnisse bei Bedarf verwendet werden, da Sie die Möglichkeiten eingegrenzt haben.

SELECT @Result = 
CASE @inputParam 
WHEN 1 THEN 1 
WHEN 2 THEN 2 
WHEN 3 THEN 1 
ELSE 4 
END 

IF @Result = 1 
BEGIN 
... 
END 

IF @Result = 2 
BEGIN 
.... 
END 

IF @Result = 4 
BEGIN 
//Error handling code 
END