如何在SSIS中使用Oracle OLE DB提供程序时使用变量映射?

时间:2016-05-04 13:38:53

标签: oracle variables parameters ssis mapping

如何在使用Oracle OLE DB提供程序时使用变量映射?我做了以下事情:

  1. 执行SQL任务:完整结果集以保存查询结果。
  2. Foreach ADO枚举器:ADO对象源上面的变量(对象数据类型)。
  3. 变量映射:1个字段。
  4. 该变量设置为评估为Express(True)
  5. 数据流:来自变量的SQL命令,作为SELECT columnName FROM table其中columnName =?
  6. 基本上我要做的是使用来自SQL Server表的查询结果(即..帐号)和从Oracle引用记录引用SQL查询的结果

2 个答案:

答案 0 :(得分:1)

感觉就像是在混合物品。参数化?是变量的占位符,在OLE DB源组件中,您可以单击“参数”按钮并映射。

但是,由于您正在使用变量中的SQL命令,因此不允许您使用参数化选项,可能是因为用户通过表达式更改结果集形状的风险太高。

因此,选择一个 - 具有适当参数化的“SQL命令”或“来自变量的SQL命令”,其中以可疑的字符串构建方式添加参数,如Dynamically assign value to variable in SSIS SQL Server 2005/2008 / 2008R2人,意识到在使用表达式的字符串变量中限制为4k个字符。

根据评论“基本上我要做的是使用SQL Server表中的查询结果(即..帐号)和从Oracle引用记录引用SQL查询的结果”< / p>

有两种方法可以解决这个问题。根据您目前开发的内容,我的上述答案仍然有效。您正在粉碎帐号并将其用作查询到Oracle的过滤器。这将针对您拥有的每个帐号向Oracle发出查询。这可能是也可能不是可取的。

这种方法的优点是它允许您检索多行。假设您正在提取销售订单类型的信息,则一个帐号可能包含许多销售订单行。

但是,如果您正在处理与帐号有一对一映射的内容,例如帐户级数据,那么您可以简化您正在采用的方法。将SQL Server查询移动到数据流中的OLE DB源组件。

然后,您正在寻找的是Lookup组件。这允许您使用其他数据来丰富现有数据行。在这里,您将指定一个类似“SELECT AllTheColumnsICareAbout,AccountNumber FROM schema.Table”的查询。然后,您将从OLE DB源中将AccountNumber映射到查找组件中的一个,并单击要使用扩充现有行的所有列旁边的复选标记。

答案 1 :(得分:0)

我相信您所问的是如何使用SSIS将数据推送到Oracle OleDb提供程序。

我将假设Oracle是目的地。开箱即用不支持使用带有可变列的数据目标的想法。您应该能够使用SSIS API或其他方法,我采用更简单的方法。

我最近设置了一个包来从数据库中获取所有表并创建动态CSV输出。每个表一个文件。你可以做类似的事情。

将一个节的切换器部件切换为1.在目标中创建表。 2.将记录插入Oracle。我不确定您是否需要对Oracle进行单一插入。在另一个反向运行的项目中,动态csv进入SQL。我使用SQL服务器,我加载数据表并使用SQLBulkCopy类来使用批量加载,这提供了出色的性能。

    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;