SQL Server 2000“yield return”结果行为

时间:2012-07-19 20:30:56

标签: c# sql-server tsql

我对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窗体中执行此操作,方法是将个别请求发送到我们的服务器,但这会导致服务器崩溃并耗尽所有可用连接。

2 个答案:

答案 0 :(得分:2)

这种情况下,您不希望使用存储过程,而是编写基于集合的代码。从处理一个记录到处理多个记录时,代码重用通常是一件坏事。

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

顺便说一句,你不应该用sp_前缀来命名procs,因为它会首先在系统过程中查找它们,然后在用户过程中查找它们,这样你就可以获得性能损失(尽管很小,但它可以累加整个系统)每个proc的每一次运行,如果系统proc以相同的名称结束,它将使用它而不是你的。

答案 1 :(得分:1)

根据您的意见,我将优化存储过程。

但是,如果你只是想快速简单地指出需要多长时间

只是做

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

并根据您的粗略表现数据乘以一些小提琴因子,比如说.5秒。

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

请注意DMO可与2000,你可以得到一个向后兼容包,以便将与2005年和2008年的工作它(目前还与2012年工作),但它不支持,你是疯了依靠继续这样做。从2005年开始,DMO被SMO取代。

我首先要做的是首先考虑sp,然后快速获胜。