2

我想创建一个 SSIS 包,它使用通过执行 SQL 语句生成的数据写入文件。这个通用包将被其他包调用,将正确的 SQL 作为变量传递。

因此在通用包中:

我想执行动态 SELECT 查询并从单个数据库实例中获取动态列数,连接字符串不会每次调用并将结果存储到平面文件中。

在 SSIS 中实现这一目标的理想方法是什么。

我尝试了什么:

我能找到的最简单的解决方案是编写一个脚本任务,该任务将打开 SQL 连接,使用 SQLCommand 执行 SQL,使用获取的数据填充数据表,并使用 System.io.File 和 Release 将内容直接写入文件系统连接。

我尝试使用由变量提供的 SQL 的 OLE 数据库源(验证设置为 false),并将行定向到平面文件连接。但是,由于列的动态编号和名称,我遇到了错误。

有没有更标准的方法可以在不使用脚本任务的情况下实现这一目标?

4

2 回答 2

0

这个怎么样......将所有字段值连接到一个字段中,并将 AllFields 映射到文本文件目标中的一个字段。

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

所有“其他”包都知道如何创建正确的 SQL。他们与“通用”包的唯一合同是最终只有一个名为“AllFields”的字段。

于 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 回答