以下是这样的概念:当用户从前端树视图中选择用户列表并单击Save
按钮时,包含角色到用户的映射的表必须清除所有用户角色并重新插入具有给定角色ID和用户列表的记录。
我正在使用以下存储过程和函数:
存储过程:
ALTER PROCEDURE [dbo].[AssignRoleToUser]
@RoleID INT = 0,
@UserID varchar(max) = ''
AS
BEGIN
delete from UserRole
where RoleID = @RoleID
AND UserID IN (SELECT UserID FROM UserRole)
INSERT INTO UserRole(UserID, RoleId)
SELECT id, @RoleID
FROM dbo.CSVToTable(@UserID)
END
功能
CREATE FUNCTION [dbo].[CSVToTable] (@InStr VARCHAR(MAX))
RETURNS @TempTab TABLE (id int not null)
AS
BEGIN
;-- Ensure input ends with comma
SET @InStr = REPLACE(@InStr + ',', ',,', ',')
DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
WHILE PATINDEX('%,%', @INSTR ) <> 0
BEGIN
SELECT @SP = PATINDEX('%,%',@INSTR)
SELECT @VALUE = LEFT(@INSTR , @SP - 1)
SELECT @INSTR = STUFF(@INSTR, 1, @SP, '')
INSERT INTO @TempTab(id) VALUES (@VALUE)
END
RETURN
END
但是我收到了这个错误
Msg 217,Level 16,State 1,Procedure AssignRoleToUser,Line 7
超出了最大存储过程,函数,触发器或视图嵌套级别(限制32)。
答案 0 :(得分:0)
错误说你有一个程序,函数或触发器的调用,它调用另一个调用另一个的程序,等等,直到调用深度为32次调用。在这一点上它给予并说“太多了!”。
UserRole表上有任何触发器吗?他们会打电话给别的吗?如果是这样,他们会做什么?等等...
答案 1 :(得分:0)
错误正好说明了下面的错误以及行号。
Msg 217, Level 16, State 1, Procedure AssignRoleToUser, Line 7
从您的AssignRoleToUser
INSERT INTO UserRole(UserID, RoleId) SELECT id, @RoleID
FROM dbo.CSVToTable(@UserID)
可以看出,它正在调用另一个名为dbo.CSVToTable
的函数。同样地,dbo.CSVToTable
可能正在调用其他过程\函数以及嵌套深度达到最大限制的方式。所以错误是。
此外,在您的程序的第6行中,AND UserID IN (Select UserID from UserRole)
不需要。如下所示
delete from UserRole where RoleID = @RoleID
您可以运行以下查询,该查询将列出在运行AssignRoleToUser
过程时从链中调用的所有过程(从Get All Nested Stored Procedures观察查询)
SELECT * FROM
(SELECT NAME AS ProcedureName, SUBSTRING(( SELECT ', ' + OBJDEP.NAME
FROM sysdepends
INNER JOIN sys.objects OBJ ON sysdepends.ID = OBJ.OBJECT_ID
INNER JOIN sys.objects OBJDEP ON sysdepends.DEPID = OBJDEP.OBJECT_ID
WHERE obj.type = 'P'
AND Objdep.type = 'P'
AND sysdepends.id = procs.object_id
ORDER BY OBJ.name
FOR
XML PATH('')
), 2, 8000) AS NestedProcedures
FROM sys.procedures procs )InnerTab
WHERE NestedProcedures IS NOT NULL
AND NAME = 'AssignRoleToUser'