从不可排序的表 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 server2000的表结构(不含数据)

如何删除大量数据 sql server2005 数据量在8千万左右??

Sqlserver6.5下的数据库导回时,出现了排序规则不一样的错误,数据无法还原。

怎么导出Sql Server数据库表结构和数据的脚本

怎么导出Sql Server数据库表结构和数据的脚本

使用查询从 Microsoft SQL Server 导出数据到目标数据