【问题标题】:Unable to execute stored procedure throught sql server and also from code无法通过 sql server 和代码执行存储过程
【发布时间】:2023-03-15 07:12:01
【问题描述】:

这是我的存储过程。当我在 SQL Server 中执行以下脚本时,出现此错误:

超过最大存储过程、函数、触发器或视图嵌套级别(限制为 32)。

代码:

Create Procedure [dbo].[GetTotalProductWcnCrashes]
(
   @DroidbugCount int,
   @totalproductcrashes int out,
   @Uniqueproductcrashes int out,
   @SnsPL varchar(500) out,
   @Startdate datetime out,
   @Metabuild varchar(500) out,
   @Rivabuild varchar(500) out,
   @Appsbuild varchar(500) out,
   @toatalWcnCrashes int out,
   @UniqueWcnCrashes int out,
   @TotalHours numeric(18,0) OUT,   
   @Mtbf numeric(18,4) OUT,
   @Cpth numeric(18,4) OUT  
) 
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE
      @SQL nvarchar(max),  
      @SQLString nvarchar(max),
      @ParmDefinition nvarchar(max),
      @totalproductcrashes1 int,
      @Uniqueproductcrashes1 int ,
      @SnsPL1 varchar(500),
      @Startdate1 datetime,
      @Metabuild1 varchar(500),
      @Rivabuild1 varchar(500),
      @Appsbuild1 varchar(500),
      @toatalWcnCrashes1 int,
      @UniqueWcnCrashes1 int,
      @TotalHours1 numeric(18,0),   
      @Mtbf1 numeric(18,4),
      @Cpth1 numeric(18,4),
      @DroidbugCount1 INT         

   SET @SQL = N'SELECT @SnsPL =   SnsPl.PL, @Startdate = SnsHeader.Startdate, @Metabuild = SnsHeader.Metabuild, @Rivabuild = SnsHeader.RivaBuild, @Appsbuild = SnsHeader.Appsbuild, @totalproductcrashes = SUM(CASE WHEN dbo.SnsResult.Crash like %Yes% THEN 1 ELSE 0 END),
  @Uniqueproductcrashes = SUM(CASE WHEN dbo.SnsResult.UniqueCrash like %Yes% AND dbo.SnsResult.CR_ID is NULL THEN 1 ELSE 0 END),
  @TotalHours = Sum(CAST(dbo.SnsResult.ResultDuration AS int))
  FROM dbo.SnsHeader
  INNER JOIN dbo.SnsResult ON dbo.SnsHeader.SnsHeader_PK = dbo.SnsResult.SnsHeader_FK 
  INNER JOIN dbo.SnsPl ON dbo.SnsHeader.PL_FK = dbo.SnsPl.PL_PK 
  GROUP BY dbo.SnsPl.PL , SnsHeader.Startdate ,SnsHeader.Metabuild,SnsHeader.RivaBuild,SnsHeader.Appsbuild'

SET @SQLString= N'EXEC GetTotalProductWcnCrashes @DroidbugCount,
@totalproductcrashes OUTPUT,
@Uniqueproductcrashes OUTPUT,
@SnsPL OUTPUT,
@Startdate OUTPUT,
@Metabuild OUTPUT,
@Rivabuild OUTPUT,
@Appsbuild OUTPUT,
@toatalWcnCrashes OUTPUT,
@UniqueWcnCrashes OUTPUT,
@TotalHours OUTPUT, 
@Mtbf OUTPUT,
@Cpth OUTPUT'


SET @ParmDefinition = N'@DroidbugCount int,
@totalproductcrashes INT OUTPUT,
@Uniqueproductcrashes INT OUTPUT,
@SnsPL varchar(500) OUTPUT,
@Startdate datetime OUTPUT,
@Metabuild varchar(500) OUTPUT,
@Rivabuild varchar(500) OUTPUT,
@Appsbuild varchar(500) OUTPUT,
@toatalWcnCrashes INT OUTPUT,
@UniqueWcnCrashes INT OUTPUT,
@TotalHours numeric(18,0) OUTPUT,   
@Mtbf numeric(18,4) OUTPUT,
@Cpth numeric(18,4) OUTPUT'  


SET @DroidbugCount1 = 1
EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@DroidbugCount=@DroidbugCount1,
@totalproductcrashes = @totalproductcrashes1 OUTPUT ,
@Uniqueproductcrashes = @Uniqueproductcrashes1 OUTPUT,
@SnsPL  = @SnsPL1 OUTPUT,
@Startdate = @Startdate1 OUTPUT ,
@Metabuild = @Metabuild1 OUTPUT,
@Rivabuild = @Rivabuild1 OUTPUT,
@Appsbuild = @Appsbuild1 OUTPUT,
@toatalWcnCrashes = @toatalWcnCrashes1 OUTPUT,
@UniqueWcnCrashes = @UniqueWcnCrashes1 OUTPUT,
@TotalHours = @TotalHours1 OUTPUT,  
@Mtbf = @Mtbf1 OUTPUT,
@Cpth = @Cpth1 OUTPUT


       SELECT   @totalproductcrashes1 as N'@totalproductcrashes',
    @Uniqueproductcrashes1 as N'@Uniqueproductcrashes',
    @SnsPL1 as N'@SnsPL',
    @Startdate1 as N'@Startdate',
    @Metabuild1 as N'@Metabuild',
    @Rivabuild1 as N'@Rivabuild',
    @Appsbuild1 as N'@Appsbuild',
    @toatalWcnCrashes1 as N'@toatalWcnCrashes',
    @UniqueWcnCrashes1 as N'@UniqueWcnCrashes',
    @TotalHours1 as N'@TotalHours',
    @Mtbf1 as N'@Mtbf',
    @Cpth1 as N'@Cpth'  
  END

有人帮我纠正上面的存储过程,我是编写存储过程的新手。

以及如何从C#代码中调用上述存储过程

提前致谢。

【问题讨论】:

  • 看起来您正在尝试递归调用相同的存储过程而没有任何中断条件(也称为无限循环)。在 SQL Server 32 中是最大嵌套级别,这就是您收到此错误的原因。

标签: c# sql-server stored-procedures


【解决方案1】:

您的存储过程 GetTotalProductWcnCrashes 在无限循环中调用自身。你是如何生成这个存储过程的。

大致了解您的存储过程,您只需要第一个选择语句,当您选择要执行的存储过程时,存储过程的其余部分似乎是 SQL Management Studio 中自动生成的代码。出于某种原因,它保存在您的存储过程之上。

您的存储过程应该是这样的。但请记住,我不是您的数据库。

USE [Reports]
 GO

 SET ANSI_NULLS ON
 GO

 SET QUOTED_IDENTIFIER ON
 GO


Create Procedure [dbo].[GetTotalProductWcnCrashes]
(
@DroidbugCount int,
@totalproductcrashes int out,
@Uniqueproductcrashes int out,
@SnsPL varchar(500) out,
@Startdate datetime out,
@Metabuild varchar(500) out,
@Rivabuild varchar(500) out,
@Appsbuild varchar(500) out,
@toatalWcnCrashes int out,
@UniqueWcnCrashes int out,
@TotalHours numeric(18,0) OUT,  
@Mtbf numeric(18,4) OUT,
@Cpth numeric(18,4) OUT 
 ) 
 AS

 BEGIN

SET NOCOUNT ON;


SELECT @SnsPL =   SnsPl.PL,@Startdate=SnsHeader.Startdate,@Metabuild=SnsHeader.Metabuild,
  @Rivabuild=SnsHeader.RivaBuild,@Appsbuild=SnsHeader.Appsbuild,
  @totalproductcrashes = SUM(CASE WHEN dbo.SnsResult.Crash like '%Yes%' THEN 1 ELSE 0 END),
  @Uniqueproductcrashes = SUM(CASE WHEN dbo.SnsResult.UniqueCrash like '%Yes%' AND dbo.SnsResult.CR_ID is NULL THEN 1 ELSE 0 END),
  @TotalHours = Sum(CAST(dbo.SnsResult.ResultDuration AS int))
  FROM dbo.SnsHeader
  INNER JOIN dbo.SnsResult ON dbo.SnsHeader.SnsHeader_PK = dbo.SnsResult.SnsHeader_FK 
  INNER JOIN dbo.SnsPl ON dbo.SnsHeader.PL_FK = dbo.SnsPl.PL_PK 
  GROUP BY dbo.SnsPl.PL , SnsHeader.Startdate ,SnsHeader.Metabuild,SnsHeader.RivaBuild,SnsHeader.Appsbuild

  END

  GO

请记住,我没有数据库,我提出的这个示例可能不正确,但可以肯定的是,您的存储过程不正确,并且有争议地调用自身,最多 32 个嵌套调用计数。

还要回答您关于 cmets 的问题,请点击此 stackoverflow 链接了解如何使用 c# 调用存储过程。

How to execute a stored procedure within C# program

【讨论】:

  • 我已将其添加到答案中,请查看链接
猜你喜欢
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多