SQL Server - 将大量记录导出到多个csv文件中

时间:2015-10-19 09:26:09

标签: sql sql-server csv export

我正在运行一个查询,它给了我超过800万条记录。我已将结果导出到.csv文件中,但该文件太大而无法处理(8GB ...)。

我尝试做的是将结果csv拆分为多个文件但有一个条件:

有一个列名" Locator"代表一个ID。我设法将我的记录分组以获得这样的结果:

Locator | Name | LastName
___________________________ 
ABCDEFH | Foo  | Oof 
ABCDEFH | Foo2 | Oof2 
ABCDEFH | Foo3 | Oof3 
TUVWXYZ | Mark | Mark
TUVWXYZ | Mark2| Mark2
...     | ...  | ...

所以我想要做的就是基本上分割记录而不用拆分分组......是否可以这样做?

编辑:这是使用NTILE的查询:

with locator as 
(
    select distinct
    pnrlctrnum,
    NTILE(8) OVER(ORDER BY pnrlctrnum) as Tile_Num

from ttddocseg, ttddoc, ttdhdr
where ttddocseg.tdtrxnum = ttddoc.tdtrxnum and ttdhdr.tdtrxnum = ttddoc.tdtrxnum
)
select ttdhdr.pnrlctrnum, ttddoc.*, ttddocseg.*
from ttddocseg, ttddoc, ttdhdr
inner join locator on locator.pnrlctrnum = ttdhdr.pnrlctrnum
where Tile_num = 7 and ttddocseg.tdtrxnum = ttddoc.tdtrxnum and ttdhdr.tdtrxnum = ttddoc.tdtrxnum

2 个答案:

答案 0 :(得分:0)

您可以使用ntile函数生成组的组。这样可以确保组合在一起,然后您可以将导出分成多个您喜欢的分区。

更改数字以更改您想要的分组数量,然后您可以将其集成到您想要的导出过程中。

with locator as 
(
    select ditinct
    Locator,
    NTILE(4) OVER(ORDER BY Locator) as Tile_Num
    from tbl 
)
select *
from tbl
inner join locator on locator.Locator = tbl.Locator
where Tile_num = 3

答案 1 :(得分:0)

这种方法有一个错误。在 Person.Address 表中的示例 AdventureWorks DB 上重现相同的示例

with ps as 
(
SELECT distinct PostalCode, ntile(6) over (order by PostalCode) as part
  FROM [Person].[Address]
)

 select * from( select PostalCode, count(distinct part) as part_count from ps group by PostalCode ) as tmp where part_count>1

结果是:

<头>
邮政编码 part_count
3977 2
78400 2
92118 2
97301 2
GA10 2

有些邮政编码属于 1 个以上的组。这是因为分离是首先执行的。 ntile 尝试在不考虑值的情况下将相同大小的组分开,并且通过在 select 中使用 distinct ,您最终会在每个组中得到不同的值,但正如我们所见,某些值可能会重复。

为了避免这种情况再次发生,您应该首先获得不同的邮政编码,然后将它们分成几组,最后执行与主表的连接。

 with ps as
 (
 select PostalCode, ntile(6) over (order by PostalCode) as part   
 from (select distinct PostalCode from Person.Address ) as tmp
 )
 
 select * from Person.Address a inner join ps on a.PostalCode= ps.PostalCode

通过这种方式,您可以将邮政编码组保存在同一分区中。正如您所见,分区中没有最大值等于下一个分区的最小值。

 select ps.part, min(a.PostalCode)  as minimum, max(a.PostalCode) as maximum from Person.Address a inner join ps 
        on a.PostalCode= ps.PostalCode group by ps.part
<头>
部分 最低 最大
1 01071 32960
2 33000 59100
3 59101 84070
4 84074 94066
5 94070 EM15
6 G1R YO15