2011-07-13 63 views
0

我有一个SPROC让我们称之为:AccountExists,参数AccountID。我有另一个SPROC让我们称之为:CreateAccount在存储过程中执行带参数的存储过程

我想从CreateAccount拨打AccountExists,并传递AccountID。的排序是这样的:

IF NOT EXISTS (AccountExists(AccountID)) 
BEGIN 
    INSERT INTO dbo.Accounts 
     (AccountID, 
      AccountName) 
END 

如果能够按照我想要创建帐户的存储过程,将调用的检查,看是否该帐户已经存在的逻辑。

回答

2

我不确定我是否正确理解了您的问题,但我会尽力发布答案。

这里的第一个例子使用带输出参数的存储过程将结果返回到布尔变量@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很长一段时间了,所以如果错了,那就打我:)

+0

第二个例子正是我所需要的。通过这种方式,我可以调用一个SPROC来检查帐户ID是否已经存在,并从其他几个SPROCS中调用该帐户。那么如果以后我决定改变如何跟踪账户,我只有一个地方可以改变。 – iJared