2011-02-28 57 views
1

我遇到了一个商业案例,在该案例中,我需要超出32级的嵌套SP调用,这是SQL Server的限制。有人可以说是否有可能增加这个限制?超过SQL Server SP调用嵌套级别32

+3

我建议,其时间来审查您的业务案例实施,并选择一个不违反技术范围使用的新的。 – 2011-02-28 06:17:31

回答

4

否,32是限制:Maximum Capacity Specifications for SQL Server

Nesting Stored Procedures

32是一个深调用栈;我以前从未达到过这个限制。它表明你应该寻找一种替代方法。

+1

+1。在SQL中,我几乎看不到深度超过3-4的调用堆栈。这就是说有些人似乎认为sql server是一个应用服务器。我有人有缓慢的​​SQL存储过程......感谢每一行的外部Web服务调用;) – TomTom 2011-02-28 06:22:51

1

如果您达到此限制,那么您应该使用udfs或CTE作为您的递归代码。如果它不是递归的,那真是糟糕的设计。

我从来没有低于约4深,包括触发更

0

递归调用可能是一个很好的特点,尤其是当你的输出XML,你需要获得在格式为XML相等子节点父母。解决方法是使用存储过程处理父/子关系,但缺少更复杂/冗余的代码。假设你有:

create table Users (UserID int, Name nvarchar(50), ManagerID int null) 
insert into Users (1, 'Carl', null) 
insert into Users (2, 'Tom', 1) 
insert into Users (3, 'John', 1) 

create function GetUser(@UserID int) 
returns XML as 
begin 
    declare @xml XML 
    SET @xml = (
     SELECT [UserID] "User/@UserID" 
      , [Name] "User/@Name" 
      FROM Users 
      WHERE [UserID] = @UserID 
     FOR XML PATH(''), TYPE 
    ) 
    return @xml 
end 

要获得所有管理人员的XML:

create proc GetAllManagers() as 
begin 
    set nocount on; 
    SELECT dbo.GetUser([UserID]) 
    FROM Users 
    WHERE [ManagerID] IS NULL 
    FOR XML PATH(''), TYPE, root('Managers') 
end 

现在的问题。如果对每个经理来说,我想要所有属于经理的用户呢?我想我的功能,能够自称:

alter function GetUser(@UserID int, @IsIncludeChildren bit) 
returns XML as 
begin 
    declare @xml XML 
    SET @xml = (
     SELECT [UserID] "User/@UserID" 
      , [Name] "User/@Name" 
      , (SELECT dbo.GetUser([UserID], 0)) "User/Children" 
      FROM Users 
      WHERE [ManagerID] = @UserID AND @IsIncludeChildren = 1 
     FOR XML PATH(''), TYPE 
    ) 
    return @xml 
end 

,并呼吁这只是

alter proc GetAllManagers() as 
begin 
    set nocount on; 
    SELECT dbo.GetUser([UserID], 1) 
    FROM Users 
    WHERE [ManagerID] IS NULL 
    FOR XML PATH(''), TYPE, root('Managers') 
end 

但是,这是因为嵌套限制不可能的。因此,解决方法是(使用第一功能):

alter proc GetAllManagers() as 
begin 
    set nocount on; 
    SELECT 
     dbo.GetUser([UserID]) 
    , (
     SELECT dbo.GetUser([UserID]) 
      FROM Users 
      WHERE [ManagerID] = [Users].[UserID] 
      FOR XML PATH(''), TYPE 
    ) "User/Children" 

    FROM Users as [Users] 
    WHERE [ManagerID] IS NULL 
    FOR XML PATH(''), TYPE, root('Managers') 
end 

这是不是太糟糕,但如果你有很多的回归用户数据等程序,你必须建立在所有特效的父/子关系,而不是在一个单一的功能!

那么,微软呢,修复它!