2015-12-21 98 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; 
... 
相关问题