2017-02-07 20 views
0

1つのクエリから複数のCSVファイルを作成するようにSQL Serverを取得しようとしています。現時点では、CSVファイルを分離するために出力する必要のある7回の長時間実行(それぞれ2時間以上)のクエリがあります。私はすべてを呼び出すクエリを作成できますが、それは1つの巨大なCSVを生成します。各内部クエリが完了した後に別のCSVを作成するようにSQL Serverに指示する方法はありますか?SQL Server 1つのクエリから複数の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

エージェントジョブを作成して作成できますか。それぞれのクエリーに対して別々のジョブステップを実行できます。ステップセクションの[詳細設定]タブには、出力オプションがあります。

+0

私はジョブを作成しようとしましたが、動作していないようです。それは決して私にファイル名を尋ねたことはなく、実行するように思えたが、出力を生成しなかったと思った。私は仕事で間違ったものを設定することは可能ですが、すべてが正しいように見えました。 –

+0

出力を要求しません。 SSISを使用することを示唆している他の答えと同じように、SSISを使用することをお勧めします。実際にはより良い考えですが、出力パスはステップの「出力ファイル」ボックスにハードコードする必要があります。 – NathanAck

+0

出力ファイルに関する注釈をありがとう。それは理にかなっている。私はSSISのオプションを探しています。 –

2

現在のクエリではなく、これらのストアドプロシージャを実行するラッパーとして、SSISパッケージを作成することができます。

各ストアドプロシージャはフラットファイル出力にリンクできます。

これは、さまざまな呼び出し間で必要な依存関係を表現でき、(可能であれば)いくつかの並列処理を利用できるという利点があります(呼び出しの一部またはすべてに依存しない場合)。

0

私が探していた答えではありませんが、誰かが私のSQLプロシージャを呼び出してExcelファイルに出力するVisual StudioでC#プロシージャを書く手助けをしていました。それは機能し、私は将来それを再利用することができます。

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()); 
     } 
    } 
} 
関連する問題