2015-12-21 100 views
0

我在SQL Server 2008中創建了一個存儲過程,但我無法執行它。被返回的錯誤是:SQL Server 2008中的「無法找到存儲過程」

消息2812,級別16,狀態62,過程CASCADE_BRANCH_COUNT2 19行
未能找到存儲過程 'CASCADE_BRANCH_COUNT2'

在SQL Server Management Studio中,我右鍵單擊對象資源管理器窗口中的過程,然後選擇腳本存儲過程爲>執行到>新建查詢編輯器窗口,然後執行過程。所以程序肯定存在。

我試過重新啓動SQL Server Management Studio,刷新智能感知緩存和創建不同的名稱下的過程。

該過程是遞歸的,所以我不知道這是否可能導致問題。

該過程旨在查找樹的頂部節點,然後遍歷樹中的每個節點,以便將分支計數分配給與每個節點關聯的記錄。

如果包含@ClientId的樹僅包含一個節點,則此過程不會發生任何錯誤。任何多於一個節點,它似乎會產生錯誤消息。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [MyDB].[CASCADE_BRANCH_COUNT2] 
    (@ClientId INT, @UserId INT, @BranchCount INT, @Override INT) 
AS 
BEGIN 
    DECLARE @Counter INT = 0; 
    DECLARE @Children INT = 0; 
    DECLARE @Buffer INT = 0; 

    --Not Top Node Of Tree 
    IF @Override = 0 and @ClientId in (SELECT BranchClientId FROM ClientBranches) 
    BEGIN 
     SET @Buffer = (SELECT TOP 1 ParentClientId 
         FROM ClientBranches 
         WHERE BranchClientId = @ClientId) 
     EXEC CASCADE_BRANCH_COUNT2 @Buffer, @UserId, @BranchCount, 0; 
    END; 

    --Reached Top Node And Updating Fields For All Child Nodes 
    ELSE 
    BEGIN 
     IF @Override = 1 OR @ClientId IN (SELECT ParentClientId 
              FROM ClientBranches) 
     BEGIN 
      SET @Children = (SELECT COUNT(BranchClientId) 
          FROM ClientBranches 
          WHERE ParentClientId = @ClientId); 

      WHILE @Counter < @Children 
      BEGIN 
       SET @Buffer = (SELECT TOP 1 BranchClientId 
           FROM ClientBranches 
           WHERE ParentClientId = @ClientId 
           AND BranchClientId NOT IN (SELECT TOP (@Counter) BranchClientId 
                  FROM ClientBranches 
                  WHERE ParentClientId = @ClientId)) 

       EXEC CASCADE_BRANCH_COUNT2 @Buffer, @UserId, @BranchCount, 1; 
       SET @Counter = @Counter + 1; 
      END; 

      IF @ClientId IN (SELECT ClientId FROM ClientColumns) 
      BEGIN 
       UPDATE ClientColumns 
       SET ClientColumns.BranchCount = @BranchCount, 
        ClientColumns.UpdatedUserId = @UserId 
      END; 
     ELSE 
     BEGIN 
      INSERT INTO ClientColumns (ClientId, CreatedUserId, CreatedOn, UpdatedUserId, BranchCount) 
      VALUES(@CLIENTID, @UserId, GETDATE(), @USERID, @BranchCount) 
      END; 
     END; 
    END; 
END; 

回答

4

的問題是,你創造了MyDB架構PROC,但你是在默認執行它:

... 
BEGIN 
SET @Buffer = (SELECT TOP 1 ParentClientId FROM ClientBranches WHERE BranchClientId = @ClientId) 
EXEC CASCADE_BRANCH_COUNT2 @Buffer, @UserId, @BranchCount, 0; 
END; ^--- Here 
... 

你需要指定在proc模式:

... 
BEGIN 
SET @Buffer = (SELECT TOP 1 ParentClientId FROM ClientBranches WHERE BranchClientId = @ClientId) 
EXEC MyDB.CASCADE_BRANCH_COUNT2 @Buffer, @UserId, @BranchCount, 0; 
END; ^--- Here 
... 

您還需要在需要修復的過程中進一步調用另一個電話:

... 
EXEC MyDB.CASCADE_BRANCH_COUNT2 @Buffer, @UserId, @BranchCount, 1; 
SET @Counter = @Counter + 1; 
... 
相關問題