【问题标题】:"Could Not Find Stored Procedure" in SQL Server 2008SQL Server 2008 中的“找不到存储过程”
【发布时间】:2016-03-28 00:54:30
【问题描述】:

我在 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;

【问题讨论】:

    标签: sql sql-server sql-server-2008 stored-procedures recursion


    【解决方案1】:

    问题是您在 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;
    ...
    

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2011-09-29
      • 2015-01-26
      • 2011-12-19
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多