我遇到了一个商业案例,在该案例中,我需要超出32级的嵌套SP调用,这是SQL Server的限制。有人可以说是否有可能增加这个限制?超过SQL Server SP调用嵌套级别32
1
A
回答
4
否,32是限制:Maximum Capacity Specifications for SQL Server
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
这是不是太糟糕,但如果你有很多的回归用户数据等程序,你必须建立在所有特效的父/子关系,而不是在一个单一的功能!
那么,微软呢,修复它!
相关问题
- 1. 触发器嵌套级别超出了?
- 2. 嵌套级别
- 3. 超级嵌套表
- 4. 当嵌套级别超过3时,展开嵌套RealmProxyObject失去值
- 5. SQL Server - 需要根据嵌套级别返回数据
- 6. 你可以嵌套System.Data.Entity.Include超过2个级别?
- 7. 嵌套Java内部类超过一个级别是否合理?
- 8. JSON文本或Perl结构超过最大嵌套级别
- 9. 如果语句超过嵌套级别,则无法添加?
- 10. 使用JSON嵌套级别
- 11. 双嵌套级别的SQL查询
- 12. 使用SQL Server 2014超过了最大存储过程,函数,触发器或视图嵌套级别(限制32)
- 13. 超过了最大存储过程,函数,触发器或视图嵌套级别(限制32)。
- 14. XSD工具跳过嵌套级别
- 15. 超级CSV嵌套豆
- 16. 如何过滤某个嵌套级别的嵌套字典?
- 17. SQL Server SELECT嵌套
- 18. 级别的SQL Server
- 19. 调用SQL Server存储过程在SQL Server中创建新的SP对象
- 20. xamDataGrid - 缩进嵌套级别
- 21. CakePHP嵌套级别错误
- 22. 使用嵌套的存储过程结果调用存储过程Sql Server 2008
- 23. 错误调用通过LINQ SQL SP时
- 24. 在SQL Server中嵌套表
- 25. SQL Server - 嵌套查询
- 26. SQL Server嵌套选择
- 27. 嵌套选择(SQL Server)
- 28. Sql Server 2008嵌套视图
- 29. SQL Server 2008兼容级别
- 30. sql server兼容性级别
我建议,其时间来审查您的业务案例实施,并选择一个不违反技术范围使用的新的。 – 2011-02-28 06:17:31