1

I am trying to put an IF/ELSE statement into a stored procedure.

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 '+@ENTY_TABLE_NAME+'_ATTR WHERE FIELD_ID='+@FIELD_ID+
      ' AND ATTR_VAL LIKE ''%'+@VALUE+'%'' ORDER BY ATTR_VAL ' )
END

I am getting this error and I have been banging my head against the wall trying to fix it.

Msg 156, Level 15, State 1, Procedure Sp_enty_srch_attr_vals, Line 14 [Batch Start Line 17]
Incorrect syntax near the keyword 'ELSE'.

What is wrong with this script?

3
  • 3
    Don't name your stored procedures with the "sp_" prefix on SQL Server. Commented Feb 1, 2017 at 15:45
  • @pmbAustin Ok, I will change them. Why? Commented Feb 1, 2017 at 15:47
  • 2
    The "sp_" prefix is used by the system for system procedures that are stored in the master database. It causes a look-up for the stored procedure in master first, and then in your current database second, so it's a performance hit. Here are some details: sqlperformance.com/2012/10/t-sql-queries/sp_prefix Commented Feb 1, 2017 at 15:49

3 Answers 3

3

When you have more than one statement in an IF condition, then you need to use a BEGIN-END block

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

Also do not prefix sp_ to your stored procedure. All the system stored procedures will be prefixed with sp_. Here is the articles about the problem

Should I Use the sp_ Prefix for Procedure Names?

Is the sp_ prefix still a no-no?

Sign up to request clarification or add additional context in comments.

Comments

1

You need BEGIN and END to bracket your code in the body of your IF/ELSE. You can also move the SET NOCOUNT ON to outside the IF:

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 '+@ENTY_TABLE_NAME+'_ATTR WHERE FIELD_ID='+@FIELD_ID+
      ' AND ATTR_VAL LIKE ''%'+@VALUE+'%'' ORDER BY ATTR_VAL ' )
      END
END

go  

Comments

1

For multi-line IF/ELSE statements you should use a BEGIN/END block, eg.

  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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.