【问题标题】:IF and ELSE inside stored procedure存储过程中的 IF 和 ELSE
【发布时间】:2017-02-01 15:44:04
【问题描述】:

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

我遇到了这个错误,我一直在用头撞墙试图修复它。

消息 156,级别 15,状态 1,过程 Sp_enty_srch_attr_vals,第 14 行 [批处理开始第 17 行]
关键字“ELSE”附近的语法不正确。

这个脚本有什么问题?

【问题讨论】:

  • 不要在 SQL Server 上使用“sp_”前缀命名您的存储过程。
  • @pmbAustin 好的,我会更改它们。为什么?
  • 系统将“sp_”前缀用于存储在主数据库中的系统过程。它首先在 master 中查找存储过程,然后在您当前的数据库中查找,因此会影响性能。以下是一些细节:sqlperformance.com/2012/10/t-sql-queries/sp_prefix

标签: sql sql-server stored-procedures


【解决方案1】:

如果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?

【讨论】:

    【解决方案2】:

    您需要 BEGIN 和 END 将代码括在 IF/ELSE 正文中。您还可以将 SET NOCOUNT ON 移到 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  
    

    【讨论】:

      【解决方案3】:

      对于多行 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
      

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多