如何从 SQL 查询中执行 SQL 查询
How to execute SQL query from within an SQL query
我正在使用 SQL Server 2014。我有一个名为 "Withdraw" 的 SQL 查询,其中 return 的值为 0 或 -1,具体取决于成功与否它的操作。
我想做的是创建第二个查询,它将执行第一个查询并将 return 值放在一个变量中,这样我就可以在新查询的 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
您可以将该查询转换为函数,而不是使用 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()
这是使用存储过程的 return 值设置变量的正确语法(假设变量已经声明):
EXEC @rc = [schema].[StoredProc]
{Parameters, if any}
我正在使用 SQL Server 2014。我有一个名为 "Withdraw" 的 SQL 查询,其中 return 的值为 0 或 -1,具体取决于成功与否它的操作。
我想做的是创建第二个查询,它将执行第一个查询并将 return 值放在一个变量中,这样我就可以在新查询的 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
您可以将该查询转换为函数,而不是使用 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()
这是使用存储过程的 return 值设置变量的正确语法(假设变量已经声明):
EXEC @rc = [schema].[StoredProc]
{Parameters, if any}