在存储过程中执行带参数的存储过程
问题描述:
我有一个SPROC让我们称之为:AccountExists
,参数AccountID
。我有另一个SPROC让我们称之为:CreateAccount
。在存储过程中执行带参数的存储过程
我想从CreateAccount
拨打AccountExists
,并传递AccountID。的排序是这样的:
IF NOT EXISTS (AccountExists(AccountID))
BEGIN
INSERT INTO dbo.Accounts
(AccountID,
AccountName)
END
如果能够按照我想要创建帐户的存储过程,将调用的检查,看是否该帐户已经存在的逻辑。
答
我不确定我是否正确理解了您的问题,但我会尽力发布答案。
这里的第一个例子使用带输出参数的存储过程将结果返回到布尔变量@AccountExists
什么是你可以看到相当矫枉过正。
CREATE PROCEDURE AccountExists
@AccountID INT,
@AccountExists BIT OUTPUT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM dbo.Accounts WHERE AccountID = @AccountID)
SET @AccountExists = 0
ELSE
SET @AccountExists = 1
END
CREATE PROCEDURE CreateAccount
@AccountID INT
AS
BEGIN
DECLARE @AccountExists BIT
EXEC AccountExists @AccountID, @AccountExists OUT
IF NOT @AccountExists
INSERT INTO dbo.Accounts (AccountID, AccountName) VALUES ...
END
第二个示例使用用户定义的函数是什么恕我直言,你已经尝试在你的问题iplie什么。
CREATE FUNCTION AccountExists
(@AccountID INT)
RETURNS BIT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM dbo.Accounts WHERE AccountID = @AccountID)
RETURN 0
ELSE
RETURN 1
END
CREATE PROCEDURE CreateAccount
@AccountID INT
AS
BEGIN
IF SELECT AccountExists(@AccountID) = 0
INSERT INTO dbo.Accounts (AccountID, AccountName) VALUES ...
END
最后,第三个例子使用简单的内联测试来存储值。我不知道你的账户存在验证是多么复杂(以及你的代码有多频繁),所以这种方式可能会让你感到不舒服。
CREATE PROCEDURE CreateAccount
@AccountID INT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM dbo.Accounts WHERE AccountID = @AccountID)
INSERT INTO dbo.Accounts (AccountID, AccountName) VALUES ...
END
我不确定这是不是你要找的。另外请注意,我已经使用TSQL很长一段时间了,所以如果错了,那就打我:)
第二个例子正是我所需要的。通过这种方式,我可以调用一个SPROC来检查帐户ID是否已经存在,并从其他几个SPROCS中调用该帐户。那么如果以后我决定改变如何跟踪账户,我只有一个地方可以改变。 – iJared