【问题标题】:SQL Server Output multiple CSV files from one querySQL Server 从一个查询中输出多个 CSV 文件
【发布时间】:2017-02-07 14:25:54
【问题描述】:

我正在尝试让 SQL 服务器从一个查询中创建多个 CSV 文件。目前,我们有 7 个单独的长时间运行(每个 2 小时以上)查询需要输出到单独的 CSV 文件。我可以创建一个调用所有这些但生成一个巨大的 CSV 的查询。有没有办法告诉 SQL Server 在每个内部查询完成后创建一个单独的 CSV?

这个问题变得更加重要,因为我们的下一次生产运行将有 52 个长时间运行的查询,而我的老板不想单独运行每个查询。

EXEC dbo.Get_Result_Set1;
EXEC dbo.Get_Result_Set2;
EXEC dbo.Get_Result_Set3;
EXEC dbo.Get_Result_Set4;
EXEC dbo.Get_Result_Set5;
EXEC dbo.Get_Result_Set6;
EXEC dbo.Get_Result_Set7;

【问题讨论】:

    标签: sql-server csv


    【解决方案1】:

    您可能希望创建一个SSIS 包作为执行这些存储过程的包装,而不是您当前的查询。

    然后可以将每个存储过程链接到平面文件输出。

    这样做的好处是您应该能够表达不同调用之间的任何所需依赖关系,并且(如果可能)利用一些并行性(如果部分/所有调用之间没有依赖关系)。

    【讨论】:

      【解决方案2】:

      您可以创建一个代理作业来执行此操作吗?您可以为每个查询执行一个单独的作业步骤。在步骤部分的高级选项卡下,有一个输出选项。

      【讨论】:

      • 我确实尝试过创造一份工作,但似乎没有用。它从未向我询问文件名,并认为它似乎在运行它并没有产生任何输出。有可能我在工作中配置了错误,但一切看起来都是正确的。
      • 它不会要求输出。就像另一个建议使用 SSIS 的答案一样,老实说这可能是一个更好的主意,输出路径需要在“输出文件”框中硬编码为该步骤的高级。
      • 感谢关于输出文件的说明。这就说得通了。我现在正在研究 SSIS 选项。
      【解决方案3】:

      不是我一直在寻找的答案,但我最终有人帮我在 Visual Studio 中编写了一个 C# 过程,该过程调用我的每个 SQL 过程并将每个过程输出到 Excel 文件。它有效,我可以在将来重复使用它。

      using System.Collections.Generic;
      using System.Configuration;
      using System.Data;
      using System.Data.SqlClient;
      using System.IO;
      using System.Linq;
      using System.Text;
      
      namespace StoredProcedureRunner
      {
          class Program
          {
              public static void Main(string[] args)
              {
                  var storedProcs = new List<string>();
      
                  storedProcs.Add "dbo.Get_Result_Set1");
                  storedProcs.Add "dbo.Get_Result_Set2");
                  storedProcs.Add "dbo.Get_Result_Set3");
                  storedProcs.Add "dbo.Get_Result_Set4");
                  storedProcs.Add "dbo.Get_Result_Set5");
                  storedProcs.Add "dbo.Get_Result_Set6");
                  storedProcs.Add "dbo.Get_Result_Set7");
      
                  foreach (var storedProc in storedProcs)
                  {
                      var table = GetDataTable(storedProc);
                      WriteDataTableToCSV(storedProc + ".csv", table);
                  }
              }
      
              public static DataTable GetDataTable(string storedProc)
              {
                  DataTable table = new DataTable();
      
                  using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConStrg"].ConnectionString))
                  {
                      using (var command = new SqlCommand(storedProc, connection))
                      {
                          using (var adapter = new SqlDataAdapter(command))
                          {
                              command.CommandType = CommandType.StoredProcedure;
                              command.CommandTimeout = 0
                              adapter.Fill(table);
                          }
                      }
                  }
      
                  return table;
              }
      
              public static void WriteDataTableToCSV(string filename, DataTable table)
              {
                  StringBuilder sb = new StringBuilder();
      
                  var columnNames = table.Columns.Cast<DataColumn>().Select(col => col.ColumnName);
                  sb.AppendLine(string.Join(",", columnNames));
      
                  foreach(DataRow row in table.Rows)
                  {
                      var fields = row.ItemArray.Select(field => field.ToString());
                      sb.AppendLine(string.Join(",", fields));
                  }
      
                  File.WriteAllText(filename, sb.ToString());
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2015-05-04
        • 2016-05-29
        • 1970-01-01
        • 2013-04-11
        • 2018-08-10
        相关资源
        最近更新 更多