sql查询迭代查询

时间:2011-11-10 16:29:31

标签: sql stored-procedures

我写了一个存储过程,它返回了一个作者的合同状态。如果作者不存在,我将返回-900。所以,这就是我所做的

  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,它会进入else并返回0。所以,我颠倒了它们并输入了正确的id,但它仍然只返回0而不是合同值。 你可以帮我解决我一直在做的错误。数据库是pubs。

4 个答案:

答案 0 :(得分: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,则使用输出参数

答案 1 :(得分: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

答案 2 :(得分:0)

您没有返回合同价值。您只是选择要标记的标量值。存储过程返回0,因为它完成了执行而没有返回值。

此外,不确定它是否是拼写错误,但您的from条款中还有额外的select

答案 3 :(得分:0)

尝试:

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

          END