【发布时间】: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