【问题标题】:Export each client's orders to separate CSV file将每个客户的订单导出到单独的 CSV 文件
【发布时间】:2018-02-21 17:11:11
【问题描述】:

我有以下查询:

Select CustomerID, OrderName, OrderQuantity 
from Customers C join Orders O on C.CustomerID = O.CustomerID

结果:

CutomerID | OrderName | OrderQuantity
1001      | Chicken   | 2
1001      | Meat      | 5
1002      | Pepsi     | 13
1002      | 7Up       | 7

是否可以将每个客户行导出到单独的 CSV 文件?


所以customer1001.csv文件会有

CutomerID | OrderName | OrderQuantity
1001      | Chicken   | 2
1001      | Meat      | 5

customer1002.csv 文件将有

CutomerID | OrderName | OrderQuantity
1002      | Pepsi     | 13
1002      | 7Up       | 7

【问题讨论】:

  • 您现在如何导出为 CSV?您可以在 SSIS 中执行此操作
  • @Nick.McDermaid 我还没有编写任何代码 - 我可以使用 SSIS,但是您将如何通过 SSIS 完成此操作?
  • 要在 SSIS 中执行此操作,您使用 SELECT DISTINCT CustomerID FROM YourTable 生成一个记录集,然后使用它来驱动每个循环。然后在循环中生成一个文件名并为该客户 ID 选择数据。这是概念:red-gate.com/simple-talk/sql/ssis/…
  • 如果你不想使用 SSIS,@sarslan 下面有一个很好的答案
  • 我正在尝试@sarslan 的答案——我同意这似乎是一个很好的答案。只是遇到一些错误,我不确定是什么原因造成的。谢谢

标签: sql sql-server-2012 export-to-csv


【解决方案1】:

你能试试这个吗?您应该更改查询中的数据库名称。

DECLARE CURS CURSOR FOR
Select C.CustomerID from Customers C join Orders O on C.CustomerID = O.CustomerID GROUP BY C.CustomerID

DECLARE @CustomerID INT
DECLARE @sqltext varchar(4000);

OPEN CURS
FETCH NEXT FROM CURS INTO @CustomerID

WHILE @@FETCH_STATUS = 0  
BEGIN 

SET @sqltext = 'bcp "Select CustomerID, OrderName, OrderQuantity from [DB].[dbo].Customers C join [DB].[dbo].Orders O on C.CustomerID = O.CustomerID WHERE C.CustomerID = ''' 
    + CONVERT(VARCHAR, @CustomerID) 
    + '''" queryout "D:\Test\customer' + CONVERT(VARCHAR, @CustomerID) + '.csv" -c -T -x -t,'

EXEC master..xp_cmdshell @sqltext

FETCH NEXT FROM CURS INTO @CustomerID
END
CLOSE CURS
DEALLOCATE CURS

【讨论】:

  • 感谢 Sarslan,我得到了这些结果:输出用法:bcp {dbtable |查询} {在 |出|查询 |格式} 数据文件 [-m maxerrors] [-f 格式文件] [-e errfile] [-F firstrow] [-L lastrow] [-b batchsize] [-n 本机类型] [-c 字符类型] [-w 宽字符类型] [-N 保留非文本本机] [-V 文件格式版本] [-q 引用标识符] [-C 代码页说明符] [-t 字段终止符] [-r 行终止符] [-i 输入文件] [- o outfile] [-a packetsize] [-S 服务器名称] [-U 用户名] [-P 密码] [-x 生成 xml 格式文件] [-d 数据库名称] [-K 应用程序意图] [-l 登录超时]
  • 这意味着 BCP 命令行的生成存在一些问题。你能在EXEC master....之前的行中添加PRINT @sqltext并显示它打印的内容吗?
  • 没有错误 - 这是打印结果 - 抱歉,我将 select 语句更改了位 - bcp "Select p.policyid, P.brooklandsreference , c.cmets , c.date added from brooklands.dbo。 policydetails P join brooklands.dbo.cmets C on P.PolicyID = C.policyID where p.policyid = '7279'" queryout "D:\Test\customer7279.csv" -c -T -x
  • 看来是对的,你用的是哪个sql server版本?我用sql2012试了一下。
  • 仅供参考:您看到的“单列”内容纯粹是 Excel 的产物。该文件没有任何问题,只是excel打开它的方式。如果你在记事本中打开它,你会明白我的意思。
猜你喜欢
  • 2019-08-18
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多