3

在我工作场所的 SQL Server 2008 设置中,我们设置了一个名为的数据库表,DATE_RANGE_CONTROL其中包含两列:数据类型为 DateTime。我们的 SSIS 包从 Oracle 数据库中提取设定日期范围内的数据,因此我们在 DB Source Editor 中的大部分 SQL 代码采用以下形式:startDateendDate

SELECT COLUMN1,COLUMN2,COLUMN3,TRANSACTION_DATE
FROM SOURCE_DATABASE_TABLE
WHERE TRANSACTION_DATE BETWEEN startDate AND endDate 

我想要做的是动态设置startDate和,endDate以便在执行时,查询从DATE_RANGE_CONTROL表中获取值。我已经研究过使用变量中的 SQL 命令作为选项,但我无法弄清楚如何将表的值和startDate表中的值提供给 DB Source SQL 命令。endDateDATE_RANGE_CONTROL

我在 SQL SERVER 2000 DTS 包中做了类似的事情,我在其中使用 ACTIVEX 脚本任务动态设置数据泵的 SQLCommand 属性。我如何在 SSIS 中做到这一点?

4

2 回答 2

2

在 Google 上花费了大量时间并浏览了 Microsoft SQL Server 2008 SSIS 文档后,我终于破解了它。为自己感到骄傲。因此解决方案是:

  1. 在 SQL Server 商业智能开发工作室中,创建一个新的 SSIS 包。
  2. 创建 3 个变量,我称为minestartDate和. 确保它们都具有 Package 的范围级别,并确保它们的数据类型分别为和..endDatestrDataSourceSQLInt32Int32String
  3. 在“控制流”选项卡上,将Script Task工具箱中的 a 拖到“控制流”窗格中。右键单击它并从弹出菜单中选择编辑。
  4. Script页面上,单击 右侧的省略号ReadWriteVariables。勾选您在步骤 1 中创建的变量,user::startDateuser::endtDateuser::strDataSourceSQL。您可以在General page. 这是一个很好的做法。
  5. Script页面上,单击Edit Script...按钮以显示带有一些预先编写的代码的 Visual Studio IDE 窗格。
  6. 进行以下更改。在页面顶部,您会注意到要使用的导入命名空间和类的几行。编辑代码行并确保您具有以下行:

    使用系统;
    使用 System.Data;
    使用 Microsoft.SqlServer.Dts.Runtime;
    使用 System.Data.OleDb;
    
  7. 转到菜单项目 > 添加参考。在 .NET 选项卡上,确保选择

    Microsoft.SqlServer.DTSPipelineWrap
    Microsoft.SqlServer.DTSRuntimeWrap
    归功于 DotNetMonster的提示。

  8. 在里面

    公共无效主要()
    方法,你会看到一条评论说
    // TODO: 在此处添加您的代码
    我们将替换该行或添加以下代码行。顺便说一句,我使用 OLEDB 作为我的数据源和数据目的地。

  9. //声明变量
    Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100 cmParams;
    System.Data.OleDb.OleDbConnection oleDbConn;
    
    
    ConnectionManager cm;
    Int32 strStartDate;
    Int32 strEndDate;
    String startDateSQL = "SELECT StartDate FROM DATE_RANGE_CONTROL";
    String endDateSQL   = "SELECT EndDate FROM DATE_RANGE_CONTROL";
    
    
    //Declare and assign Connection manager
    cm = Dts.Connections["YOUR_OLEDB_CONNECTION_MANAGER_NAME"];
    
    //Set Connection paramters
    cmParams = cm.InnerObject as Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100;
    
    //Instantiate the Oledb connection
    oleDbConn = cmParams.GetConnectionForSchema() as OleDbConnection;
    

    分配strStartDatestrEndDate变量,运行我们稍后将显示的函数的结果。它确实为 OLEDB 连接提供了一个 SQL 命令。

        strStartDate = (int)assignSQLCommand(startDateSQL,oleDbConn).ExecuteScalar();
        strEndDate = (int)assignSQLCommand(endDateSQL, oleDbConn).ExecuteScalar();

        //将SQL结果集的值赋给startDate和endDate变量
        Dts.Variables["startDate"].Value = strStartDate;
        Dts.Variables["endDate"].Value = strEndDate;

声明一个名为dataSourceSQLstring 类型的变量并将您的 DataSource SQL 代码分配给它。将日期范围值替换为上述变量的值。对我来说,代码如下:

    String dataSourceSQL = "SELECT COLUMN1,COLUMN2,COLUMN3,TRANSACTION_DATE
    FROM SOURCE_DATABASE_TABLE
    WHERE TRANSACTION_DATE BETWEEN '"+Dts.Variables["startDate"].Value +"' AND '"+Dts.Variables["endDate"].Value+"'";

然后将值分配dataSourceSQL给您的strDataSourceSQL包变量

    Dts.Variables["strDataSourceSQL"].Value = dataSourceSQL ;

在方法的大括号之外public void Main(),添加我们之前讨论过的以下函数。

    公共 OleDbCommand assignSQLCommand(字符串 SqlCommand,OleDbConnection oledbconn)
    {
        返回新的 System.Data.OleDb.OleDbCommand(SqlCommand, oledbconn);
    }

转到菜单构建 > 构建 [脚本名称]。保存并关闭脚本页面。最后,剩下的就是创建一个数据源任务。转到Data Flow选项卡,将 OLE DB DB 源拖到窗格中。右键单击 OLE DB 源并选择编辑。在 Connections Manager 页面上,选择您的 OLE DB 连接管理器,然后Data access mode选择SQL command from variable. 在变量名中选择user::strDataSourceSQL。只要您将脚本任务设置为在数据流之前运行,工作就完成了!

于 2013-05-28T14:55:12.010 回答
0

这就是我能做到的。在 OLE DB Source 中,输入您的 sql 语句并输入 ? 作为参数。单击 [Parameters...] 按钮并从列表中选择您的变量

于 2014-04-21T01:21:52.127 回答