【问题标题】:stored procedure with if else sql server 2008if else sql server 2008的存储过程
【发布时间】:2013-04-11 03:01:03
【问题描述】:

我有 3 个表,我必须检查祖父表 id 是否有孙表中的记录。如果是,则返回是,否则返回否。这是我的存储过程。我收到了不正确的语法错误。我是存储过程的新手。请帮帮我。

CREATE PROCEDURE P_Check
   @PKG_ID INT,
   @S_ID INT,
   @FLAG VCHAR(10) OUT

   DECLARE IDS CURSOR LOCAL FOR SELECT S_ID FROM T1 WHERE P_ID = @PKG_ID
   OPEN IDS
   FETCH NEXT FROM IDS into @S_ID

   WHILE @@FETCH_STATUS = 0
   BEGIN
      SELECT * FROM T2 WHERE S_ID = @S_ID

      IF @@ROWCOUNT<>0
         @FLAG = 'YES'
         RETURN 
      ELSE
         @FLAG = 'NO'

      FETCH NEXT FROM IDS into @S_ID
   END

   CLOSE IDS
   DEALLOCATE IDS

【问题讨论】:

    标签: sql sql-server-2008 tsql stored-procedures


    【解决方案1】:

    需要检查的几件事:

    1. 我认为 SQL Server 中没有 vchar 数据类型,除非那是您的自定义类型。所以改成varchar
    2. 你忘记了AS
    3. 您可能希望在ifbeginend 之间包含您的逻辑

    你可以编译的代码:

    CREATE PROCEDURE P_Check
        @PKG_ID INT,
        @S_ID INT,
        @FLAG VARCHAR(10) OUT
    AS
        DECLARE IDS CURSOR LOCAL FOR SELECT S_ID FROM T1 WHERE P_ID = @PKG_ID
        OPEN IDS
        FETCH NEXT FROM IDS into @S_ID
        WHILE @@FETCH_STATUS = 0
    
        BEGIN
          SELECT * FROM T2 WHERE S_ID = @S_ID
          IF @@ROWCOUNT<>0
          BEGIN
             SET @FLAG = 'YES'
             RETURN 
          END
          ELSE
          BEGIN
             SET @FLAG = 'NO'
             FETCH NEXT FROM IDS into @S_ID
          END
        END
    
        CLOSE IDS
        DEALLOCATE IDS
    

    但是,我认为您的光标不会在您返回IF @@ROWCOUNT&lt;&gt;0 时关闭。我认为你应该做的是改变这个:

    IF @@ROWCOUNT<>0
    BEGIN
        SET @FLAG = 'YES'
        RETURN 
    END
    

    到这里:

    IF @@ROWCOUNT<>0
    BEGIN
        SET @FLAG = 'YES'
        GOTO ON_EXIT
    END
    

    然后像这样结束你的程序:

    ON_EXIT:
        CLOSE IDS
        DEALLOCATE IDS    
    

    然后在评论中回答您的问题,您在某种意义上已经“回复”了它。您可以像这样调用和测试您的程序:

    declare @result varchar(10)
    exec P_Check 1, 1, @result out
    print @result
    

    【讨论】:

    • 通过匹配 S_ID 在 t1 和 t2 之间进行连接是否可以实现相同的功能?
    • 我建议您使用@marc_s 的答案。您的问题最初是语法错误,优化它是另一回事。 Marc_s 的回答是一个不错的选择。
    【解决方案2】:

    这太复杂了,这里完全不需要也完全没有必要使用光标。

    将您的程序简化为:

    CREATE PROCEDURE P_Check
       @PKG_ID INT,
       @S_ID INT,
       @FLAG CHAR(1) OUT
    AS BEGIN
       IF EXISTS (SELECT * FROM T2 
                  INNER JOIN T1 ON T2.S_ID = T1.S_ID WHERE P_ID = @PKG_ID)
          SET @FLAG = 'Y'
       ELSE
          SET @FLAG = 'N'
    END
    

    当认真使用 SQL Server 时,您需要摆脱使用游标和循环的程序逐行思维,您需要开始在集合中思考 提高效率和生产力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2010-12-13
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多