2017-02-07 2 views
0

Я пытаюсь получить SQL-сервер для создания нескольких файлов CSV из одного запроса. В это время у нас есть 7 отдельных длительных (2+ часа каждый) запросов, которые необходимо выводить для разделения файлов CSV. Я могу создать один запрос, который вызывает все из них, но генерирует один гигантский CSV. Есть ли способ сказать SQL Server создать отдельный 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; 

ответ

0

Не могли бы вы создать Agent Job для этого? Вы можете сделать отдельный шаг задания для каждого из запросов. На вкладке «Дополнительно» в разделе «Шаг» есть опция вывода.

+0

Я попытался создать работу, но это, похоже, не сработало. Он никогда не спрашивал меня о имени файла и думал, что он, кажется, запускал его, не производил никакого вывода. Возможно, я настроил что-то неправильно в работе, но все выглядело правильно. –

+0

Он не будет запрашивать выход. Как и в другом ответе, предлагающем использовать SSIS, который, честно говоря, является, вероятно, лучшей идеей, выходной путь должен быть жестко закодирован в поле «Выходной файл» под расширенным для этого шага. – NathanAck

+0

Спасибо за эту заметку о выходном файле. В этом есть смысл. Сейчас я просматриваю опцию SSIS. –

2

Возможно, вы захотите создать пакет SSIS в качестве оболочки для выполнения этих хранимых процедур, а не вашего текущего запроса.

Каждая хранимая процедура затем может быть связана с выходом плоского файла.

Это имеет то преимущество, что вы должны иметь возможность выражать любые необходимые зависимости между различными вызовами и (если возможно) использовать некоторый параллелизм (если между некоторыми/всеми вызовами нет зависимостей).

0

Не тот ответ, который я искал, но у меня возникли проблемы с тем, что кто-то помог мне написать процедуру C# в Visual Studio, которая вызывает каждую из моих процедур 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()); 
     } 
    } 
} 
Смежные вопросы