SQL Server 2008中带有if else的存储过程

3

我有三个表格,我需要检查祖父表的id是否在孙子表中存在记录。如果是,返回yes,否则返回no。这是我的存储过程代码,但是它出现了语法错误。我对存储过程还比较陌生,请帮助我。

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
2个回答

4

需要检查的几个事项:

  1. 我认为 SQL Server 中没有 vchar 数据类型,除非那是你自定义的类型。所以请将其更改为 varchar
  2. 你忘记了 AS
  3. 你可能想将你的逻辑用 beginend 围起来放在 if 的中间

代码已编译:

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<>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

通过在t1和t2之间匹配S_ID进行连接,是否可以实现相同的效果? - Maximus
我建议你采用@marc_s的答案。你的问题最初是一个语法错误,优化它是另一回事。Marc_s的答案是一个很好的选择。 - von v.

3

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

简化你的流程:

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时,您需要摆脱使用游标和循环进行程序性逐行处理的思维方式,开始以集合为思考对象,才能够高效且产出更多成果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接