在存储过程中使用/参数执行存储过程

时间:2011-07-13 02:01:08

标签: sql sql-server tsql

我有一个SPROC,我们称之为AccountExists,参数为AccountID。我有另一个SPROC让我们称之为:CreateAccount

我想从AccountExists拨打CreateAccount,然后传递AccountID。有点像这样:

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

如果您能够遵循逻辑,我想要一个创建帐户SPROC,它将调用该支票以查看该帐户是否已存在。

1 个答案:

答案 0 :(得分: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

第二个例子使用用户定义的函数恕我直言,你试图在你的问题中找到什么。

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已经很长时间了,所以如果它错了,那就打败我了:)