2017-02-01 4 views
1

Я пытаюсь поместить инструкцию IF/ELSE в хранимую процедуру.IF и ELSE внутри хранимой процедуры

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 

Я получаю эту ошибку, и я ударил головой о стену, пытаясь ее исправить.

Msg 156, Level 15, State 1, процедура Sp_enty_srch_attr_vals, строка 14 [Batch Start Line 17]
Неправильный синтаксис около ключевого слова 'ELSE'.

Что не так в этом скрипте?

+3

Не указывайте свои хранимые процедуры с префиксом «sp_» на SQL Server. – pmbAustin

+0

@pmbAustin Хорошо, я изменю их. Зачем? –

+2

Префикс «sp_» используется системой для системных процедур, которые хранятся в основной базе данных. Сначала он вызывает поиск хранимой процедуры в master, а затем в вашей текущей базе данных, так что это удар производительности. Вот несколько деталей: https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix – pmbAustin

ответ

3

Если у вас есть более одного оператора в качестве IF состоянии, то вам нужно использовать BEGIN-END блок

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

Также не префикс sp_ к хранимой процедуре. Все системные хранимые процедуры будут иметь префикс sp_. Вот статьи о проблеме

Should I Use the sp_ Prefix for Procedure Names?

Is the sp_ prefix still a no-no?

1

Вам необходимо начать и закончить в скобки код в теле вашего IF/ELSE. Вы также можете переместить SET NOCOUNT ON наружу ПЧ:

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

Для многострочно IF/ELSE утверждения следует использовать BEGIN/END блок, например.

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