根据表和目标中的每个 SQL 语句导出平面文件

Eng*_*eah 6 sql-server ssis etl

我还是 SSIS 的新手,

现在我可以根据这个视频读取 SQLStatement、FileName 和 FileLocation

但是我在根据 SQL 表中的文件位置导出平面文件时遇到了问题。

在此处输入图片说明

您可以查看我的示例包。此外,以下屏幕截图显示了存储信息的 SQL 表结构:

不同的文件名、不同的文件位置和不同的 SQL 命令

在此处输入图片说明

Eng*_*eah 0

  1. 使用脚本任务
  2. 创建一个变量。
  3. 将变量输入到 ReadOnlyVariables:User::FileDelimiter、User::FileExtension、User::LogFolder、User::SQLStatement

在此输入图像描述

它还包括后端的脚本

public void Main()
        {
            string datetime = DateTime.Now.ToString("yyyyMMddHHmmss");
            try
            {

                //Declare Variables
                string SQLStatement = Dts.Variables["User::SQLStatement"].Value.ToString();
                string FileDelimiter = Dts.Variables["User::FileDelimiter"].Value.ToString();
                string FileExtension = Dts.Variables["User::FileExtension"].Value.ToString();



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


                //Read list of Tables with Schema from Database
                string query = "SELECT FilesName,FileDestination,SQLStatement FROM "+ SQLStatement;

                //MessageBox.Show(query.ToString());
                SqlCommand cmd = new SqlCommand(query, myADONETConnection);
                DataTable dt = new DataTable();
                dt.Load(cmd.ExecuteReader());

                //Loop through datatable(dt) that has schema and table names
                foreach (DataRow dt_row in dt.Rows)
                {
                    string FileName = "";
                    string FileDestination = "";
                    string TableName = "";
                    object[] array = dt_row.ItemArray;
                    FileName = array[0].ToString();
                    FileDestination = array[1].ToString();
                    TableName = array[2].ToString();

                    string FileFullPath = FileDestination + FileName; //DestinationFolder + "\\" + SchemaName + "_" + TableName + "_" + datetime + FileExtension;

                    //Get the data for a table into data table 
                    string data_query = TableName; //"SELECT * FROM [" + SchemaName + "].[" + TableName + "]";
                    SqlCommand data_cmd = new SqlCommand(data_query, myADONETConnection);
                    DataTable d_table = new DataTable();
                    d_table.Load(data_cmd.ExecuteReader());

                    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(d_table.Columns[ic]);
                        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(dr[ir].ToString());
                            }
                            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;


                }
            }
        }
Run Code Online (Sandbox Code Playgroud)