2015-12-04 2 views
0

Я использую SQL Server 2014. У меня есть SQL-запрос под названием «Withdraw», который возвращает значение 0 или -1, в зависимости от успеха его работы.Как выполнить SQL-запрос из SQL-запроса

Что я хочу сделать, это создать второй запрос, который будет выполнять первый, и поместить возвращаемое значение в переменную, чтобы я мог использовать его в выражении IF в новом запросе.

Простым способом сделать это будет копирование кода другого запроса, который может быть выполнен (это не так долго для запроса), но мне было интересно, есть ли более элегантный способ сделать это с помощью выполняя запрос, а не копируя его.

Спасибо, ребята!

Вывод запроса:

PROC [dbo].[withdrawl] 
    (@AccountNum AS INT, 
    @Amount AS INT) 
AS 
BEGIN 
    set nocount on 

    declare @rc as integer 

    begin transaction 
    begin try 
     IF @Amount < 20000 
     BEGIN 
      IF @Amount < ((SELECT crntbalance FROM tblAccounts WHERE acctNum = @AccountNum) + (SELECT overdraftsz FROM tblAccounts WHERE acctNum = @AccountNum)) 
      BEGIN 
       UPDATE tblAccounts 
       SET crntbalance -= @Amount 
       WHERE acctNum = @AccountNum 

       INSERT INTO tblTransactions (actNum, trnTypCod, amount) 
       VALUES (@AccountNum, 1, @Amount) 

       UPDATE tblAccounts 
       SET crntbalance += -5 
       WHERE acctNum = @AccountNum 

       INSERT INTO tblTransactions (actNum, trnTypCod, amount) 
       VALUES (@AccountNum, 5, 5) 

       SET @rc = 0 
      END 
      ELSE 
      BEGIN 
       PRINT 'You do not have sufficient funds in your account to make this withdrawl.' 
       SET @rc = -1 
      END 
     END 
     ELSE 
     BEGIN 
      IF @Amount < ((SELECT crntbalance FROM tblAccounts WHERE acctNum = @AccountNum) + (SELECT overdraftsz FROM tblAccounts WHERE acctNum = @AccountNum)) 
      BEGIN 
       UPDATE tblAccounts 
       SET crntbalance -= @Amount 
       WHERE acctNum = @AccountNum 

       INSERT INTO tblTransactions (actNum, trnTypCod, amount) 
       VALUES (@AccountNum, 1, @Amount) 

       SET @rc = 0 
      END 
      ELSE 
      BEGIN 
       PRINT 'You do not have sufficient funds in your account to make this withdrawl.' 
       SET @rc = -1 
      END 
     END 

     commit transaction 
    END TRY 
    BEGIN CATCH 
     rollback transaction 
     SET @rc = -1 
    END CATCH 

    BEGIN 
     SELECT 
      crntbalance AS 'New Balance' 
     FROM 
      tblAccounts 
     WHERE 
      acctNum = @AccountNum 
    END 

    return @rc 
END 

Новый запрос:

CREATE PROCEDURE Transfer 
    (@TakeAccount AS INT, @GiveAccount as INT, @amount as INT) 
AS 
BEGIN 
    declare @rc as integer 
    BEGIN TRY 
     set @rc = EXECUTE dbo.withdrawl 
     IF @rc = -1 
      BEGIN 

      END 
     ELSE 
      BEGIN 
      END 
    END TRY 
    BEGIN CATCH 
    END CATCH 
END 
+0

Если удалось опубликовать некоторый код, который мы можем помочь. В противном случае мы просто догадываемся. –

+0

Добавлено в исходное сообщение :) Спасибо :) –

+0

Я не понимаю, в чем проблема. Что случилось с вашим текущим кодом? –

ответ

3

Это правильный синтаксис для установки переменной с возвращаемым значением хранимая процедура (предполагается, что переменная уже объявлена):

EXEC @rc = [schema].[StoredProc] 
    {Parameters, if any} 
+0

Отлично! Спасибо! –

1

Вместо использования PROC вы можете конвертировать этот запрос в функцию

CREATE FUNCTION [dbo].[Withdraw] 
(
    -- insert parameters here 
) 
RETURNS int 
AS 
BEGIN 

    DECLARE @Result int 

    -- insert processing here 
    set @Result = -1 


    return @Result 
END 

Результаты, о которых вы можете затем используйте в своем другом запросе

SET @rc = dbo.Withdraw() 
+0

Смогу ли я запустить его в качестве запроса и выполнить его работу? i.e. все еще находится в «хранимых процедурах» и может ли он выполняться как обычно? –

+1

Традиционная мудрость заключается в том, что функции не должны вставлять или обновлять. Они должны просто возвращать значения/данные. –

+0

Тогда, хотя это полезный общий совет, мне это не поможет, поскольку мне еще нужна процедура, чтобы делать другие вещи. Это может помочь мне в другом месте, хотя, так что спасибо: D –

Смежные вопросы