2017-02-01 1 views
1

Ich versuche, eine IF/ELSE-Anweisung in eine gespeicherte Prozedur zu setzen.IF und ELSE innerhalb der gespeicherten Prozedur

CREATE PROCEDURE [dbo].[Sp_enty_srch_attr_vals] 
    (@ENTY_ID INT, 
    @FIELD_ID INT, 
    @VALUE VARCHAR(5000), 
    @SQL VARCHAR(5000) 
    ) 
AS 
BEGIN 
    IF (@FIELD_ID = 148) 
     SET nocount ON; 

     SET @SQL = 'SELECT DISTINCT [GPI] FROM [GPI_ASOC] WHERE [GPI] LIKE ''%@VALUE%'' ORDER BY GPI'; 
     SET @SQL = replace(@SQL, '@VALUE', @VALUE); 

     EXEC SP_EXECUTESQL @SQL; 

    ELSE 
     SET nocount ON; 
     DECLARE @ENTY_TABLE_NAME VARCHAR(500) 

     SET @ENTY_TABLE_NAME = (SELECT TOP 1 enty_table_name 
           FROM enty 
           WHERE enty.enty_id = @ENTY_ID) 

     EXEC('SELECT DISTINCT ATTR_VAL FROM '[email protected]_TABLE_NAME+'_ATTR WHERE FIELD_ID='[email protected]_ID+ 
     ' AND ATTR_VAL LIKE ''%'[email protected]+'%'' ORDER BY ATTR_VAL ') 
END 

Ich bekomme diesen Fehler und ich habe meinen Kopf gegen die Wand hämmern versucht, es zu beheben.

Msg 156, Ebene 15, Status 1, Prozedur Sp_enty_srch_attr_vals, Zeile 14 [Batch Startlinie 17]
falsche Syntax nahe dem Schlüsselwort 'ELSE'.

Was ist falsch an diesem Skript?

+3

Benennen Sie Ihre gespeicherten Prozeduren nicht mit dem Präfix "sp_" auf SQL Server. – pmbAustin

+0

@pmbAustin Ok, ich werde sie ändern. Warum? –

+2

Das Präfix "sp_" wird vom System für Systemprozeduren verwendet, die in der master-Datenbank gespeichert sind. Es verursacht zuerst eine Suche nach der gespeicherten Prozedur in Master und dann in Ihrer aktuellen Datenbank, also ist es ein Leistungseinbruch. Hier sind einige Details: https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix – pmbAustin

Antwort

3

Wenn Sie mehr als eine Anweisung in einem IF Zustand haben, dann müssen Sie einen BEGIN-END Block

If <<condition>> 
BEGIN 
    <<stmt 1>> 
    <<stmt 2>> 
END 
ELSE 
BEGIN 
    <<stmt 3>> 
    <<stmt 4>> 
END 

auch nicht sp_ zu Ihrer gespeicherten Prozedur Präfix tun verwenden. Allen gespeicherten Systemprozeduren wird das Präfix sp_ vorangestellt. Hier ist die Artikel über das Problem

Should I Use the sp_ Prefix for Procedure Names?

Is the sp_ prefix still a no-no?

1

Sie benötigen BEGIN und END Code in den Körper Ihres IF/ELSE auszuklammern. Sie können auch die SET NOCOUNT ON außerhalb der IF bewegen:

CREATE PROCEDURE [dbo].[Enty_srch_attr_vals] (@ENTY_ID INT, 
               @FIELD_ID INT, 
               @VALUE VARCHAR(5000), 
               @SQL  VARCHAR(5000)) 
AS 
BEGIN 
    SET nocount ON; 
     IF(@FIELD_ID = 148) 
     BEGIN 
     SET @SQL = 'SELECT DISTINCT [GPI] FROM [GPI_ASOC] WHERE [GPI] LIKE ''%@VALUE%'' ORDER BY GPI'; 
     SET @SQL = replace(@SQL, '@VALUE', @VALUE); 
     EXEC SP_EXECUTESQL @SQL; 
     END 
     ELSE 
     BEGIN 
     DECLARE @ENTY_TABLE_NAME VARCHAR(500) 
     SET @ENTY_TABLE_NAME = (SELECT TOP 1 enty_table_name 
           FROM enty 
           WHERE enty.enty_id = @ENTY_ID) 

     EXEC('SELECT DISTINCT ATTR_VAL FROM '[email protected]_TABLE_NAME+'_ATTR WHERE FIELD_ID='[email protected]_ID+ 
     ' AND ATTR_VAL LIKE ''%'[email protected]+'%'' ORDER BY ATTR_VAL ') 
     END 
END 

go 
1

Für mehrzeiligen IF/ELSE-Anweisungen Sie einen BEGIN/END-Block, zum Beispiel verwendet werden soll.

IF(@FIELD_ID = 148) 
    BEGIN 
    SET nocount ON; 
    SET @SQL = 'SELECT DISTINCT [GPI] FROM [GPI_ASOC] WHERE [GPI] LIKE ''%@VALUE%'' ORDER BY GPI'; 
    SET @SQL = replace(@SQL, '@VALUE', @VALUE); 
    EXEC SP_EXECUTESQL @SQL; 
    END 
Verwandte Themen