SQL 命令调用递归存储过程
SQL command calls recursive stored procedure
我在 SQL 服务器中有一个存储过程,我使用 SqlConnection
和 SqlCommand
从 ASP.NET 核心应用程序调用它。我不断收到异常:
Maximum stored procedure, function trigger, or view nesting level exceeded (limit 32)
我不知道这是什么意思,所以我查阅了它并看到了类似的帖子,但我所能收集到的是我很可能在我的存储过程中发生了某种递归。在这个存储过程中,只有一个 INSERT
语句执行了 32 次而不是只执行了一次。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[addToTable]
(@title nvarchar(100), @genre int)
AS
BEGIN
INSERT INTO [dbo].[Books] (Title, GenreId)
VALUES (@title, @genre)
END
BEGIN
EXEC addToTable @title, @genre
END
C# 调用非常简单。
using (SqlConnection con = new SqlConnection("Connection String"))
{
using (SqlCommand cmd = new SqlCommand("dbo.addToTable", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@title", SqlDbType.NVarChar).Value = "string value";
cmd.Parameters.Add("@genre", SqlDbType.NVarChar).Value = 5;
cmd.Connection.Open();
cmd.ExecuteNonQuery(); //Exception happens here
cmd.Connection.Close();
}
}
我设置了一个断点并逐步执行代码,异常发生在 ExecuteNonQuery()
上,我只能假设这是因为过程中的某些原因。
你不应该把那个 EXEC 命令放在最后。删除它。这里发生的事情是您声明一个存储过程,然后在定义中执行它。所以基本上每次调用存储过程时,它都会调用自己。
就这样做
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[addToTable]
(@title nvarchar(100), @genre int)
AS
BEGIN
INSERT INTO [dbo].[Books] (Title, GenreId)
VALUES (@title, @genre)
END
--Delete the following
--BEGIN
--EXEC addToTable @title, @genre
--END
我在 SQL 服务器中有一个存储过程,我使用 SqlConnection
和 SqlCommand
从 ASP.NET 核心应用程序调用它。我不断收到异常:
Maximum stored procedure, function trigger, or view nesting level exceeded (limit 32)
我不知道这是什么意思,所以我查阅了它并看到了类似的帖子,但我所能收集到的是我很可能在我的存储过程中发生了某种递归。在这个存储过程中,只有一个 INSERT
语句执行了 32 次而不是只执行了一次。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[addToTable]
(@title nvarchar(100), @genre int)
AS
BEGIN
INSERT INTO [dbo].[Books] (Title, GenreId)
VALUES (@title, @genre)
END
BEGIN
EXEC addToTable @title, @genre
END
C# 调用非常简单。
using (SqlConnection con = new SqlConnection("Connection String"))
{
using (SqlCommand cmd = new SqlCommand("dbo.addToTable", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@title", SqlDbType.NVarChar).Value = "string value";
cmd.Parameters.Add("@genre", SqlDbType.NVarChar).Value = 5;
cmd.Connection.Open();
cmd.ExecuteNonQuery(); //Exception happens here
cmd.Connection.Close();
}
}
我设置了一个断点并逐步执行代码,异常发生在 ExecuteNonQuery()
上,我只能假设这是因为过程中的某些原因。
你不应该把那个 EXEC 命令放在最后。删除它。这里发生的事情是您声明一个存储过程,然后在定义中执行它。所以基本上每次调用存储过程时,它都会调用自己。
就这样做
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[addToTable]
(@title nvarchar(100), @genre int)
AS
BEGIN
INSERT INTO [dbo].[Books] (Title, GenreId)
VALUES (@title, @genre)
END
--Delete the following
--BEGIN
--EXEC addToTable @title, @genre
--END