这就是概念:当用户从前端树形视图中选择用户列表并单击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
但是我得到这个错误
消息217,级别16,状态1,过程AssignRoleToUser,第7行超出了
最大存储过程,函数,触发器或视图嵌套级别(限制32)。
错误恰恰是在说出下面的错误以及行号。
Msg 217, Level 16, State 1, Procedure AssignRoleToUser, Line 7
从您的程序中取出第7行 AssignRoleToUser
INSERT INTO UserRole(UserID, RoleId) SELECT id, @RoleID
FROM dbo.CSVToTable(@UserID)
可以看出,它正在调用另一个名为的函数dbo.CSVToTable
。同样,dbo.CSVToTable
可能正在调用其他过程/函数,这就是嵌套深度达到最大限制的方式。错误是这样。
同样,AND UserID IN (Select UserID from UserRole)
不需要您的过程中的第6行。这使得它如下
delete from UserRole where RoleID = @RoleID
您可以运行以下查询,该查询将列出在运行AssignRoleToUser
过程时在链中被调用的所有过程(从“获取所有嵌套存储过程”中观察到的查询)
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'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句