SQL-запрос, повторяющийся по запросу - PullRequest
1 голос
/ 10 ноября 2011

Я написал хранимую процедуру, которая возвращает статус контракта для автора.Если автора не существует, я верну -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

Однако, когда я даю действительный идентификатор автора в качестве входных данных, он возвращает -900, а если я даю какой-то идентификатор, он переходит в другое и просто возвращает 0.Итак, я изменил их и ввел правильный идентификатор, но он по-прежнему просто возвращает 0, а не значение контракта.Можете ли вы помочь мне исправить ошибку, которую я делал.БД пабов.

Ответы [ 4 ]

1 голос
/ 10 ноября 2011

в одну сторону

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

но статус возврата не совпадает с набором результатов если процесс успешен, вы получите 0, с возвратом вы можете использовать только целые числа, используйте выходной параметр, если вам нужно вернуть varchar

1 голос
/ 10 ноября 2011

хранимая процедура может «возвращать» три типа вещей:

  • 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 голосов
/ 10 ноября 2011

попробуй:

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

          END
0 голосов
/ 10 ноября 2011

Вы не возвращаете стоимость контракта.Вы просто выбираете скалярное значение для вычисления.Хранимая процедура возвращает 0, потому что она завершила выполнение без возвращаемого значения, отличного от этого.

Кроме того, не уверен, что это опечатка, но в предложении select есть дополнительный from.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...