2013-04-11 83 views
3

我有3个表,我必须检查祖父母表ID是否有记录在孙表中。如果是,则返回yes,否则返回no。这是我的存储过程。我得到了不正确的语法错误。我是存储过程的新手。请帮帮我。存储过程,如果还有SQL服务器2008

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 

回答

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

谢谢,它的工作原理!我如何返回@标志是或否? – 2013-04-11 03:32:40

+0

不客气。看到我更新的答案。 – 2013-04-11 03:42:50

+0

只需通过匹配S_ID在t1和t2之间进行连接就可以实现同样的效果吗? – Maximus 2013-04-11 04:41:05

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工作认真,你需要从脱身程序行到痛苦的排考虑使用游标和循环,你需要开始想成套是高效和生产力。