为什么我的sql代码会抛出错误

时间:2014-06-08 17:19:32

标签: sql-server error-handling

以下是这样的概念:当用户从前端树视图中选择用户列表并单击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)。

2 个答案:

答案 0 :(得分:0)

错误说你有一个程序,函数或触发器的调用,它调用另一个调用另一个的程序,等等,直到调用深度为32次调用。在这一点上它给予并说“太多了!”。

UserRole表上有任何触发器吗?他们会打电话给别的吗?如果是这样,他们会做什么?等等...

答案 1 :(得分:0)

错误正好说明了下面的错误以及行号。

Msg 217, Level 16, State 1, Procedure AssignRoleToUser, Line 7

从您的AssignRoleToUser

程序中取出第7行
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'