2011-11-10 101 views
1

我写了一个存储过程,它为anauthor返回契约状态。如果作者不存在,我会返回-900。所以,这就是我所做的通过查询迭代的sql查询

CREATE PROCEDURE AUthorContract 
    @user varchar(10) 
     AS 
      IF(@user NOT IN(select Au_id from Authors)) 
      BEGIn 
       RETURN -900 
      END 
     ELSE 
     BEGIN 
     select contract from from Authors where Au_id = @user 
     END 

     GO 

然而,当我给一个有效的作者ID作为输入,返回-900,如果我给一些ID它进入别的,只是返回0。所以,我反转了它们并输入了正确的id,但它仍然只返回0而不是合同值。 你能帮我解决我一直在做的错误吗? DB是pubs。

回答

1

存储过程可以 “回归” 三种东西:

  • int返回值,通过RETURN命令
  • 输出参数值,通过参数表:@YourPartameter anydatatype OUTPUT
  • 结果集:SELECT * FROM YourTable

你的程序没有正常退出一个RETURN命令,所以它默认的值为零。如果返回值为零,则需要检查应用程序中的结果集。

试试这个返回接触值:

CREATE PROCEDURE AUthorContract 
    @user varchar(10) 
     AS 
     DECLARE @contract int 
      IF(@user NOT IN(select Au_id from Authors)) 
      BEGIn 
       RETURN -900 
      END 
     ELSE 
     BEGIN 
     select @contract=contract from from Authors where Au_id = @user 
     END 

     RETURN @contract 

     GO 

尝试这种使用OUTPUT参数:

CREATE PROCEDURE AUthorContract 
    @user varchar(10), @contract varchar(30) OUTPUT 
     AS 
      IF(@user NOT IN(select Au_id from Authors)) 
      BEGIn 
       RETURN -900 
      END 
     ELSE 
     BEGIN 
     select @contract=contract from from Authors where Au_id = @user 
     END 

     RETURN 0 

     GO 

下面是结果集,有明确的回报:

CREATE PROCEDURE AUthorContract 
    @user varchar(10) 
     AS 
      IF(@user NOT IN(select Au_id from Authors)) 
      BEGIn 
       RETURN -900 
      END 
     ELSE 
     BEGIN 
     select contract from from Authors where Au_id = @user 
     END 

     RETURN 0 

     GO 
0

您没有退回合同价值。你只是选择一个标量值来输出。存储过程返回0,因为它完成执行时没有返回值。

此外,不知道它是否是一个错字,但您的select子句中有一个额外的from

+0

是错字错误。 – Sayamima

1

单程

CREATE PROCEDURE AUthorContract 
    @user varchar(10) 
     AS 
      IF NOT EXISTS(select 1 from Authors WHERE Au_id = @user) 
      BEGIN 
       SELECT -900 as contract -- this will return a result set 
      END 
     ELSE 
     BEGIN 
     select contract from Authors where Au_id = @user 
     END 

     GO 

但是返回状态是不一样的结果集 如果PROC成功,您将得到0,有回报,你只能使用整数,如果您使用的输出参数需要返回VARCHAR

0

尝试:

IF(@user NOT IN(select Au_id from Authors)) 
      BEGIn 
       declare @a int 
       set @a= -900 
       return @a 
       --print @a 

      END