0

我对我们的 SQL Server 2000 数据库进行了很长的查询,我正在返回结果以供我的 C# 应用程序进一步处理。

考虑这个查询:

declare @sn varchar(20)

select distinct serial_number 
from manufacturingData 
where '7/19/2012'<date_time
order by serial_number

while (0 < (select count(serial_number) from #sn)) begin
  select top 1 @sn=serial_number from #sn
  exec sp_GetSnData @sn
  delete from #sn where serial_number=@sn
end
drop table #sn

我正在写这个查询07/19/2012,所以它只返回今天的记录。

上面的查询(今天的一半)返回了 119 个不同的序列号,并使用伴随它的 while 循环执行了 52 秒。

通常,此报告的执行期限为 30 天,大约有 3500 个部件号。

有没有办法“挂钩”结果集,以便我可以在生成结果时访问它们?

现在的情况是,没有人知道查询是否需要 2 分钟或 2 天......或者它是否还在做任何事情!经理是关闭他的电脑并回家休息一天,还是这个报告查询即将完成?

返回单个表后,我需要单独处理每个表。

如果可以的话就好了

  • 找出退回了多少不同的物品,
  • 当前正在查询什么项目,以及
  • 在等待下一张表进来时,让结果表可用于处理。

这可能吗?

仅供参考:我目前在我的 Windows 窗体中通过向我们的服务器发送单独的请求来执行此操作,但这会使服务器陷入困境并耗尽所有可用的连接。

4

2 回答 2

2

这是您不想使用存储过程而是编写基于集合的代码的情况。当您从处理一条记录转为处理多条记录时,代码重用通常是一件坏事。

或者修改 proc,以便您可以发送逗号分隔的列表并将其解析为临时表并完成工作。不知道 proc 做了什么,我很想建议实际的代码来做这件事。然后它可以处理机器人单输入和多输入参数。

顺便说一句,您不应该使用 sp_ 前缀命名 procs,因为它会首先在系统 procs 中查找它们,然后在用户 procs 中查找它们,因此每次运行都会对性能造成影响(尽管个别地很小,但在整个系统上它可以加起来)每个 proc 的名称,如果系统 proc 以相同的名称结束,它将使用该名称而不是您的名称。

于 2012-07-19T20:58:55.940 回答
1

好吧,根据您的评论,我会尽力优化存储过程。

但是,如果您只想快速简单地说明需要多长时间

做就是了

select Count(distinct serial_number)  from manufacturingData  where '7/19/2012'< date_time 

并根据您的粗略性能数据将其乘以一些小提琴因子,例如 0.5 秒。

如果你想要进步,那么看看 sql server DMO 基本上你把一个打印语句放在你的循环“Processing 1 of 119 say”中。SMO 将获取输出并触发一个事件,您添加一个处理程序来驱动一个进度条。

注意 DMO 适用于 2000,并且您可以获得一个向后兼容包,因此它适用于 2005 和 2008。它确实(目前也适用于 2012),但它不受支持,你会发疯地依赖它继续这样做。从 2005 年起,DMO 被 SMO 取代。

我会先努力优化 sp,但以获得任何快速的胜利。

于 2012-07-25T16:31:30.287 回答