从不可排序的表 SQL Server 查询和导出
Posted
技术标签:
【中文标题】从不可排序的表 SQL Server 查询和导出【英文标题】:Query and export from unsortable table SQL Server 【发布时间】:2017-08-30 11:08:29 【问题描述】:首先我很抱歉我的英语不好,不是我的语言。
我的问题是:我有一张大约 1000 万条银行交易记录的表。它没有PK,也没有作为任何列排序。
我的工作是创建一个页面来过滤并将其导出到 csv。但导出 Csv 的行数限制约为 20 万条记录。
我有这样的想法:
创建 800 个 800 ATM 的表(只是一个想法,我知道这很愚蠢)并每天 1 次从主表向它发送数据 => 导出到 800 个文件 csv
使用 Linq 每次获取 100k 记录,然后下次我跳过这些。但是当Skip
命令需要OrderBy
并且我得到OutOfMemoryException
时,我被卡住了
db.tblEJTransactions.OrderBy(u => u.Id).Take(100000).ToList()
任何人都可以帮助我,欢迎每个想法(我老板说我可以使用任何东西,包括创建数百个表,使用 Nosql ...)
【问题讨论】:
没有 CSV 行限制。 Excel 有行数限制,通常使用 Excel 打开 CSV。如果您正在谈论一个允许您下载 200,000 条记录的网页,那么您可能会遇到带宽等其他问题。任何人都可以用 Excel 中的 200K 任意记录做什么? 【参考方案1】:如果您的表中没有主键,请添加一个。
最简单最简单的方法是添加一个int IDENTITY
列。
ALTER TABLE dbo.T
ADD ID int NOT NULL IDENTITY (1, 1)
ALTER TABLE dbo.T
ADD CONSTRAINT PK_T PRIMARY KEY CLUSTERED (ID)
如果您无法更改原始表,请创建一个副本。
一旦表有一个主键,您就可以按它排序并选择具有可预测结果的 200K 行的块/页。
【讨论】:
【参考方案2】:我不确定我的解决方案。不过你可以参考试试:
select top 1000000 *, row_number() over (order by (select null)) from tblEJTransactions
以上查询返回排序列表。
然后你就可以使用 Linq 来获取结果了。
【讨论】:
以上是关于从不可排序的表 SQL Server 查询和导出的主要内容,如果未能解决你的问题,请参考以下文章
如何删除大量数据 sql server2005 数据量在8千万左右??