2

SQL ステートメントの実行によって生成されたデータをファイルに書き込む SSIS パッケージを作成したいと考えています。この汎用パッケージは、正しい SQL を変数として渡す他のパッケージによって呼び出されます。

したがって、一般的なパッケージでは:

動的な SELECT クエリを実行し、単一のデータベース インスタンスから動的な数の列をフェッチしたいのですが、接続文字列は呼び出しごとではなく、結果をフラット ファイルに格納します。

SSIS でこれを達成するための理想的な方法は何でしょうか。

私が試したこと:

私が見つけた最も簡単な解決策は、SQL 接続を開き、SQLCommand を使用して SQL を実行し、フェッチしたデータを使用してデータテーブルを作成し、System.io.File と Release を使用して内容をファイル システムに直接書き込むスクリプト タスクを作成することでした。接続。

変数によって提供される SQL (検証を false に設定) で OLE データベース ソースを使用し、行をフラット ファイル接続に送信しようとしました。ただし、列の動的な番号と名前が原因で、エラーが発生しました。

スクリプト タスクを使用せずにこれを達成するためのより標準的な方法はありますか?

4

2 に答える 2

0

これはどうですか...すべてのフィールド値を1つのフィールドに連結し、AllFieldsをテキストファイルの宛先のフィールドにマップします。

SELECT [f1]+',' + [f2] AS AllFields FROM [dbo].[A]

「他の」パッケージはすべて、正しい SQL の作成方法を認識します。「ジェネリック」パッケージとの唯一の契約は、最終的に「AllFields」という名前のフィールドを 1 つだけ持つことです。

于 2013-06-16T23:32:26.243 に答える
0

あなたの質問に直接答えるために、これを行う「標準的な」方法はないと思います。Anoop のソリューションはうまく機能すると思います。アイデアをテストしていませんが、独自のソリューションを作成する前に調査しておけばよかったと思います。そのソリューションではスクリプト タスクは必要ありません...

いずれにせよ、SQL テーブルから csv ファイルを生成する独自の方法を作成しました。これは、エッジ ケースに遭遇し、研磨が必要になる可能性がありますが、現在はかなりうまく機能します。このタスクの前に複数のテーブルをループしているので、CurrentTable 変数を任意の変数に置き換えることができます。

これが私のコードです:

public void Main()
    {
        string datetime = DateTime.Now.ToString("yyyyMMddHHmmss");
        try
        {
            string TableName = Dts.Variables["User::CurrentTable"].Value.ToString();
            string FileDelimiter = ",";
            string TextQualifier = "\"";
            string FileExtension = ".csv";



            //USE ADO.NET Connection from SSIS Package to get data from table
            SqlConnection myADONETConnection = new SqlConnection();
            myADONETConnection = (SqlConnection)(Dts.Connections["connection manager name"].AcquireConnection(Dts.Transaction) as SqlConnection);



            //Read data from table or view to data table
            string query = "Select * From [" + TableName + "]";
            SqlCommand cmd = new SqlCommand(query, myADONETConnection);
            //myADONETConnection.Open();
            DataTable d_table = new DataTable();
            d_table.Load(cmd.ExecuteReader());
            //myADONETConnection.Close();



            string FileFullPath = Dts.Variables["$Project::ExcelToCsvFolder"].Value.ToString() + "\\Output\\" + TableName + FileExtension;

            StreamWriter sw = null;
            sw = new StreamWriter(FileFullPath, false);

            // Write the Header Row to File
            int ColumnCount = d_table.Columns.Count;
            for (int ic = 0; ic < ColumnCount; ic++)
            {
                sw.Write(TextQualifier + d_table.Columns[ic] + TextQualifier);
                if (ic < ColumnCount - 1)
                {
                    sw.Write(FileDelimiter);
                }
            }
            sw.Write(sw.NewLine);

            // Write All Rows to the File
            foreach (DataRow dr in d_table.Rows)
            {
                for (int ir = 0; ir < ColumnCount; ir++)
                {
                    if (!Convert.IsDBNull(dr[ir]))
                    {
                        sw.Write(TextQualifier + dr[ir].ToString() + TextQualifier);
                    }
                    if (ir < ColumnCount - 1)
                    {
                        sw.Write(FileDelimiter);
                    }
                }
                sw.Write(sw.NewLine);

            }

            sw.Close();

            Dts.TaskResult = (int)ScriptResults.Success;
        }



        catch (Exception exception)
        {
            // Create Log File for Errors
            //using (StreamWriter sw = File.CreateText(Dts.Variables["User::LogFolder"].Value.ToString() + "\\" +
            //    "ErrorLog_" + datetime + ".log"))
            //{
            //    sw.WriteLine(exception.ToString());
            //}

            Dts.TaskResult = (int)ScriptResults.Failure;
            throw;
        }


        Dts.TaskResult = (int)ScriptResults.Success;
于 2016-05-04T21:54:41.517 に答える