2011-02-28 24 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 

這是不是太糟糕,但如果你有很多的迴歸用戶數據等程序,你必須建立在所有特效的父/子關係,而不是在一個單一的功能!

那麼,微軟呢,修復它!