T-SQL Cum se încheie un bloc IF-ELSE IF-ELSE (Programare, Server Sql, Tsql)

contactmatt a intrebat.

Când execut procedura de mai jos cu parametrii corecți, astfel încât valoarea -1 să nu fie returnată, niciuna dintre instrucțiunile DML nu se activează. Bănuiesc că îmi tratează toate instrucțiunile DML ca parte a procedurii ELSE bloc.

SQL Server 2014

Cum se încheie un bloc IF-ELSE-ELSE-IF?

ALTER PROCEDURE [GenerateNumber] (
    @Code VARCHAR(2)
)
AS
BEGIN
    DECLARE @stringConcat VARCHAR = 'X';

    IF @Code = 'KP'
        SET @stringConcat += 'Y';
    ELSE IF @Code = 'RL'
        SET @stringConcat += 'Z';
    ElSE
        -- Return error code and stop processing
        SELECT -1;
        RETURN;

    BEGIN TRY
        -- Various DML statements...

        SELECT @successValue;
        RETURN;
    END TRY
    BEGIN CATCH
        SELECT -1;
        RETURN;
    END CATCH
END

6 răspunsuri
Krishnraj Rana

Bine, trebuie să utilizați Begin și End în blocul Else deoarece conține mai multe linii de cod.

    IF @Code = 'KP'
        SET @stringConcat += 'Y';
    ELSE IF @Code = 'RL'
        SET @stringConcat += 'Z';
    ElSE
    Begin
        -- Return error code and stop processing
        SELECT -1;
        RETURN;
    End

Brian Stork

Indentarea vă minte.

IF @Code = 'KP'
     SET @stringConcat += 'Y';
 ELSE IF @Code = 'RL'
     SET @stringConcat += 'Z';
 ElSE
     -- Return error code and stop processing
     SELECT -1;  -- THIS is evaluated as the ELSE
     RETURN;     -- THIS is run regardless.

Doar prima linie după ultimul ELSE va fi executată ca o condidire ELSE. Acel RETURN va fi executat indiferent. Nu se poate ajunge la BEGIN TRY al tău.

Încearcă asta:

IF @Code = 'KP'
     SET @stringConcat += 'Y';
 ELSE IF @Code = 'RL'
     SET @stringConcat += 'Z';
 ElSE
     BEGIN
     -- Return error code and stop processing
     SELECT -1;
     RETURN;
     END

Sami Kuhmonen

Dacă doriți ca ambele SELECT -1 și RETURN să fie în interiorul ELSE va trebui să folosiți un BEGIN / END . Acum, doar blocul SELECT -1 se află în interiorul ramurii else.

Așadar, aveți nevoie de

ELSE
  BEGIN
    SELECT -1;
    RETURN;
  END

Ellesedil

Ultimul ELSE din If, ELSE IF, ELSE conține mai multe linii de cod. Trebuie să o începeți cu BEGIN și să se încheie cu END. Vedeți acest lucru documentația MSDN pentru mai multe detalii.

IF @Code = 'KP'
    SET @stringConcat += 'Y';
ELSE IF @Code = 'RL'
    SET @stringConcat += 'Z';
ElSE
    BEGIN
        -- Return error code and stop processing
        SELECT -1;
        RETURN;
    END

SchmitzIT

În cazul dvs. (joc de cuvinte intenționat), ar fi mai bine să folosiți un CASE WHEN construcție, având în vedere că doriți să evaluați valori diferite pentru @Code variabilă. MSDN precizează că CASE este destinată exact pentru astfel de scenarii:

Evaluates a list of conditions and returns one of multiple possible result expressions.

Eu consider că face codul un pic mai ușor de citit pentru evaluările simple (dar ar putea foarte bine să fie o preferință personală).

Codul dvs. ar ajunge să arate asemănător cu acesta (pseudocod. nu a fost testat):

CASE @Code 
    WHEN 'KP' THEN SET @stringConcat += 'Y';
    WHEN 'RL' THEN SET @stringConcat += 'Z';
    ElSE
        -- Return error code and stop processing
        SELECT -1;
        RETURN;
END 

Mai multe despre CASE declarație aici:

https://msdn.microsoft.com/en-us/library/ms181765.aspx

UnhandledExcepSean

În exemplul dumneavoastră, RETURN se execută întotdeauna.

Din punctul meu de vedere, din punct de vedere al practicii de codare, ar trebui să folosiți întotdeauna BEGIN și END în SQL pentru a indica în mod clar ce se intenționează să fie în blocul logic. Prefer același model în C#, unde folosesc paranteze chiar și atunci când nu este necesar. Indentarea este importantă în opinia mea, de asemenea, deoarece vă permite să urmăriți cu ușurință unde începe și unde se termină.

IF(1=2)
   BEGIN
      SELECT 1
   END
SELECT 2

IF(1=2) SELECT 1
   SELECT 2

Acestea sunt echivalente în ceea ce privește comportamentul, dar prima arată clar că SELECT 1 depinde de condiția logică de deasupra sa.

Ceea ce doriți cu adevărat este:

IF @Code = 'KP'
    BEGIN
        SET @stringConcat += 'Y';
    END
ELSE IF @Code = 'RL'
    BEGIN
        SET @stringConcat += 'Z';
    END
ElSE
    BEGIN
        -- Return error code and stop processing
        SELECT -1;
        RETURN;
    END