查询以限制sql查询根据数据大小返回的记录

时间:2013-07-08 15:35:25

标签: sql sql-server sql-server-2008-r2

我必须在Excel文档中创建多个Excel工作表以提供给另一个旧系统。此代码无法修改的遗留系统不接受任何数据大小超过10 MB的工作表。

目前我有一个手动进程,通过sql查询获取所有数据,然后我将其转储到临时工作簿中,然后将其分解为多个工作簿,以便每个工作簿不超过10 MB。然后,我将这些工作簿中的每个工作表整理成一个包含多个工作表的大工作簿。

我现在想通过使用单个查询来简化这个多阶段进程,只要返回的所有记录的总大小不超过10 MB,就可以从表中获取所有记录。我还希望能够使用sql查询指定要返回的下一个10MB数据。这里不能创建一个小程序。我在查询中指定的列数可以更改。我希望能够仅使用SQL查询来执行此操作。

使用SQL Server 2008可以完成这样的事情吗?

2 个答案:

答案 0 :(得分:1)

您可以使用临时表和EXEC sp_spaceused 'tablename'来估算可容纳10MB空间的行数,然后您可以使用ROW_NUMBER()设置分页。

我很想知道是否有更好的方法来做你感兴趣的事情。

答案 1 :(得分:1)

我建议您修复每个工作簿的记录数并使用row_number()

select seqnum / 100000 as WhichWorksheet, <columns you want>
from (select s.*, row_number() over (order by (select NULL)) as seqnum
      from (<your subquery here>) s
     ) s

(这意味着您希望每个工作表上有100000行。)

您可以尝试猜测SQL Server中每行的大小。但是,弄清楚你的意思是10兆字母是一个挑战 - 你的意思是用Excel测量的10兆字节?你的意思是CSV文件中的10 MB?你的意思是数据库存储10 MB?或者,您可以忽略这些问题,并选择过去有效的行数,然后转到其他内容。