SQL Server 存储过程导致 Visual Studio 在作为数据集的一部分添加时挂起

SQL Server stored procedure causes Visual Studio to hang when added as part of a dataset

提问人:Elizabeth 提问时间:10/7/2023 最后编辑:marc_sElizabeth 更新时间:10/7/2023 访问量:90

问:

我有一个 T-SQL 存储过程,对于一组给定的参数,它返回 34 行,运行时间不到几分之一秒。

SQL 有一个 while 循环,一堆嵌套的 if 语句和一些模式。它曾经有一些语句,但我将它们改为语句。goto:If

已授予所有适当的访问权限(对表的 select、对过程的 exec)。

每当我尝试将 SQL 作为存储过程添加到 SSRS 以生成报表以拉取从该过程返回的内容时,SSRS 都会挂起。只是挂起。轮子在旋转,似乎永远都在旋转。

我确实运行了一个测试,并且我能够连接到服务器,我能够在几秒钟内毫无问题地添加不同的过程。但是这个的一些东西一直在让它崩溃。

首先声明一些标签,主要是日期。

然后创建几个本地表。

然后我们有一个 while 循环,读取 而 1=1,我想知道这是否会导致 SSRS 中的某种无限循环。

然后,如果一个日期值>另一个日期值,则语法为“如果一个日期值” break(脱离循环)

还 在临时表中插入并更新一堆内容。

它确实有开始的语法

下面是代码片段:

Parameters 
    @season_str varchar(255),
    @event_start_dt datetime,
    @event_end_dt datetime,
    @sale_end_dt datetime) 

------------------

declare @sale_start_dt datetime
select @sale_start_dt = dateadd(dd,-6,@sale_end_dt)

declare @run_date datetime,
    @include_donated char(1)

--need to report on sales the day before the start date of the report so that we
-- can know how many were sold on day 1 of the report.
select @run_date = dateadd(dd,-1,@sale_start_dt)
select @include_donated = 'N'

create table #t1 (
    perf_no int NOT NULL,
    ...
    )

while 1=1
begin
select @run_date = dateadd(dd,1,@run_date)

if convert(datetime,convert(varchar,@run_date,101)) > convert(datetime,convert(varchar,@sale_end_dt,101))
    BREAK

else 
    begin

    if convert(varchar,@run_date,101) = convert(varchar,getdate(),101)
    --if the run_date is today then we want to get up-to-date numbers so we run the procc with @run_date = NULL
    begin --run_date = NULL

       insert into #t1 ( field names )
       exec LP_SALES_SUMMARY_PTC @event_start_dt, @event_end_dt, @season_str,   NULL, @include_donated
       update #t1 set run_date = @run_date, step = 1 where run_date is null

    end --run_date is not null

    else
    begin --run_date is not NULL
    --if the run date is in the past, run the procedure with @run_date <> NULL
        insert into #t1 ( field names )
        exec LP_SALES_SUMMARY_PTC @event_start_dt, @event_end_dt, @season_str,  NULL, @include_donated
         update #t1 set run_date = @run_date, step = 1 where run_date is null


    if (select count(*) from #t1 where run_date = @run_date) = 0
    begin
        if getdate() >='08/29/2007' -- start of historic information
        begin

        insert into #t1 ( field names )
        exec LP_SALES_SUMMARY_PTC @event_start_dt, @event_end_dt, @season_str,  NULL, @include_donated
        update #t1 set run_date = @run_date, step = 1 where run_date is null
    end

    else
    begin
      
       insert into #t1 ( field names )
       exec RP_SALES_SUMMARY_PTC @event_start_dt, @event_end_dt, @season_str,   NULL, @include_donated
      update #t1 set run_date = @run_date, step = 1 where run_date is null
    end
    end
    end

end
    
-- more code continuation 
sql-server t-sql while 循环 报告服务 ssrs-2008-r2

评论

0赞 Elizabeth 10/7/2023
@AaronBertrand有数百行代码,我确定问题的原因与基本选择/更新无关。
1赞 Aaron Bertrand 10/7/2023
好吧,可能导致循环无限的一个潜在问题是,如果您的日期逻辑依赖于某种模棱两可/区域格式的字符串,那么您可能有不同的语言在起作用,并且日期的解释也不同。我们不需要看到数百行代码,但循环的基本结构(以及你如何打破它),以及任何参数、它们的类型、值以及它们如何传入,将比“它不可能是代码,但这里是对代码的模糊描述”有用得多。
0赞 Elizabeth 10/7/2023
添加了@AaronBertrand代码
0赞 Elizabeth 10/7/2023
我用日期更新了清理,并添加了其余的 if/else 组合,insert 语句只有一堆字段,这些字段来自另一个计算总数和美元金额的过程
0赞 Aaron Bertrand 10/7/2023
无论达到哪个条件,insert / exec 命令看起来都相同。这是故意的,还是只是复制/粘贴,实际命令不同?我认为这只是复制/粘贴,因为我假设存储过程的第 4 个参数是运行日期?

答:

2赞 Aaron Bertrand 10/7/2023 #1

我不确定对存储过程的调用有什么不同,但我宁愿根据值创建条件,而不是模式(因导致无限循环而臭名昭著)。此外,与其从开始减去一天,然后在循环中立即添加一天,不如保持开始日期不变,而不是在循环结束之前增加它。WHILE 1=1

我省略了 的创建和更新,但以下是我如何重新构建您的变量和循环:#t1

/* params */
DECLARE @season_str     varchar(255),
        @event_start_dt date,
        @event_end_dt   date,
        @sale_end_dt    date;

/* local variables */
declare @sale_start_dt   date    = dateadd(DAY, -6, @sale_end_dt);
declare @run_date        date    = @sale_start_dt,
        @today           date    = getdate(),
        @beginningOfTime date    = '20070829', -- start of historic info
        @include_donated char(1) = 'N';
...

WHILE @run_date <= @sale_end_dt
BEGIN
  if @run_date = @today 
  begin
    --insert into #t1 (...) EXEC LP_SALES_SUMMARY_PTC with null run_date
  end
  else
  begin
    --insert into #t1 (...) EXEC LP_SALES_SUMMARY_PTC with non-null run_date
  end

  if NOT EXISTS (select 1 from #t1 where run_date = @run_date)
  begin
    if @today >= @beginningOfTime -- start of historic information
    begin
      --insert into #t1 (...) EXEC LP_SALES_SUMMARY_PTC ... -- should it be RP?
    end
    else
    begin -- how could this ever be reached?
      --insert into #t1 (...) EXEC RP_SALES_SUMMARY_PTC ...;
    end
  end
  set @run_date = dateadd(DAY, 1, @run_date);
END

评论

0赞 Elizabeth 10/7/2023
代码更改奏效了,Visual Studio 在没有无限循环的情况下肯定会更快乐。感谢您的耐心等待。我也不知道倒数第二个 LP 是否应该是 RP - 我会对此进行进一步研究,我非常感谢您的帮助。