如何将参数传递给 ssis 中的 ado.net 源?

Posted

技术标签:

【中文标题】如何将参数传递给 ssis 中的 ado.net 源?【英文标题】:how to pass parameters to an ado.net source in ssis? 【发布时间】:2012-11-08 20:30:36 【问题描述】:

这是原始查询,使用 ado.net 源并使用源中指定的 .net providers\odbc 数据提供者可以正常工作。

SELECT a.FA_CLNT_ID, a.FA_ACCT_NM, a.ACCT_E_DT, a.POL_PER_CURR_DT, a.POL_PER_NEXT_DT, a.FA_ACCT_NUM, a.GRP_SALES_OFFC_CD, a.ACCT_C_DT   
FROM  gyv2M.DDM_ACCT_STRUC a   
INNER JOIN  
(SELECT max(DDM_ACCT_STRUC_TP) as   DDM_ACCT_STRUC_TP, FA_CLNT_ID 
 FROM gyv2M.DDM_ACCT_STRUC  
 WHERE FA_DM_ROW_DT <= '6/30/2011' AND DM_ROW_E_DT <= '6/30/2011'
 GROUP BY  FA_CLNT_ID) b 
 ON a.DDM_ACCT_STRUC_TP = b.DDM_ACCT_STRUC_TP AND a.FA_CLNT_ID = b.FA_CLNT_ID AND FA_DM_ROW_DT <= '6/30/2011' AND a.DM_ROW_E_DT <= '6/30/2011'

但我需要让它自动化,以便 DATE 从 sql server 中的表中获取值。我创建了一个变量来存储该日期值,但我想使用该变量作为参数传递给上述查询。不幸的是,我没有找到数据访问模式:来自 ado.net 源中变量的 sql 命令。我搜索了一些其他网站,发现我们可以使用表达式生成器使用一些表达式。 rt 点击 preperties ..> 表达式 ..> etc.. 成功评估了表达式。表达式如下所示,但我在那里感到震惊。接下来是什么 ?如何在 ado.net source 中将评估的表达式作为源命令传递?请帮忙。

SELECT a.FA_CLNT_ID, a.FA_ACCT_NM, a.ACCT_E_DT, a.POL_PER_CURR_DT, a.POL_PER_NEXT_DT, a.FA_ACCT_NUM, a.GRP_SALES_OFFC_CD, a.ACCT_C_DT   
FROM  gyv2M.DDM_ACCT_STRUC a   
INNER JOIN  
(SELECT max(DDM_ACCT_STRUC_TP) as   DDM_ACCT_STRUC_TP, FA_CLNT_ID 
 FROM gyv2M.DDM_ACCT_STRUC  
 WHERE FA_DM_ROW_DT <=  '@[User::RepDate]'  AND DM_ROW_E_DT <=  '@[User::RepDate]'
 GROUP BY  FA_CLNT_ID) b 
 ON a.DDM_ACCT_STRUC_TP = b.DDM_ACCT_STRUC_TP AND a.FA_CLNT_ID = b.FA_CLNT_ID AND FA_DM_ROW_DT <=  '@[User::RepDate]'  AND a.DM_ROW_E_DT <=  '@[User::RepDate]'

更新

嗨,

非常感谢您的回复。正如您所指定的,我创建了一个用户变量 user:RepDate,其中包含 datetime 和一个执行 sql 任务,该任务将 datetime 分配给该变量 RepDate。而且是的,我能够评估表达式,并且能够看到在 ado.net souce sql 命令模式下构建的查询。这是查询:

SELECT a.FA_CLNT_ID, a.FA_ACCT_NM, a.ACCT_E_DT, a.POL_PER_CURR_DT, a.POL_PER_NEXT_DT, a.FA_ACCT_NUM, a.GRP_SALES_OFFC_CD, a.ACCT_C_DT   
FROM  gyv2M.DDM_ACCT_STRUC a   
INNER JOIN  
(SELECT max(DDM_ACCT_STRUC_TP) as   DDM_ACCT_STRUC_TP, FA_CLNT_ID 
 FROM gyv2M.DDM_ACCT_STRUC  
 WHERE FA_DM_ROW_DT <= @[User::RepDate]  AND DM_ROW_E_DT <=  @[User::RepDate] 
 GROUP BY  FA_CLNT_ID) b 
 ON a.DDM_ACCT_STRUC_TP = b.DDM_ACCT_STRUC_TP AND a.FA_CLNT_ID = b.FA_CLNT_ID AND FA_DM_ROW_DT <=  @[User::RepDate] AND a.DM_ROW_E_DT <=  @[User::RepDate]

但我收到下面给出的以下错误。我认为这是因为内部查询需要我在原始查询中指定的日期格式'mm/dd/yyyy'..但是我们从用户变量中提供日期时间。 您能告诉我如何使用内置函数将用户变量的日期时间格式转换为指定格式吗?我试过 DT_Date 但没有运气。

Error at Data Flow Task 4 [ADO NET Source [1]]: The component "ADO NET Source" (1) was unable to retrieve column information for the SQL command. The following error occurred: ERROR [42601] [IBM][CLI Driver][DB2] SQL0104N  An unexpected token "[" was found following "".  Expected tokens may include:  "CONCAT || / MICROSECONDS MICROSECOND SECONDS SECOND MINUTES".  SQLSTATE=42601
ADDITIONAL INFORMATION:

Pipeline component has returned HRESULT error code 0xC02020FF from a method call. (Microsoft.SqlServer.DTSPipelineWrap)
BUTTONS:
OK

***Update2***

标题:Microsoft Visual Studio

数据流任务 [ADO NET 源 [1]] 出错:组件“ADO NET 源”(1) 无法检索 SQL 命令的列信息。发生了以下错误:错误 [22007] [IBM][CLI Driver][DB2] SQL0180N 日期时间值的字符串表示的语法不正确。 SQLSTATE=22007


附加信息:

管道组件从方法调用返回 HRESULT 错误代码 0xC02020FF。 (Microsoft.SqlServer.DTSPipelineWrap)


按钮:

好的

【问题讨论】:

您能否成功评估表达式?如果是这样,继续在数据流中加倍 ADO.Net 源并选择 SQL 命令作为数据访问模式 - 您应该会自动看到那里的查询。 SSIS - Passing Parameters to an ADO .NET Source query 的可能重复项 【参考方案1】:

您可以使用以下步骤:

    在 ADO.NET 源中使用您的工作查询。[您无法映射 ADO.NET 源的参数] 选择您的Dataflow,然后点击Properties。 在属性窗格中,查找名为“Expressions”的属性。展开它并单击“...”图标以打开 Property Expressions Editor(下面的屏幕截图)。为您的数据源选择属性 SqlCommand,然后使用表达式构建器使用 SSIS 变量(在您的情况下为日期时间变量)准备您的查询。

在你的表达式构建器中试试这个——注意你的变量必须是一个字符串,如果不是,你使用(DT_WSTR,30)来转换它。由于您使用的是日期,因此您的 SQL 将需要处理字符串格式的日期,即在 Oracle 中使用 to_date()

 "SELECT a.FA_CLNT_ID, a.FA_ACCT_NM, a.ACCT_E_DT, a.POL_PER_CURR_DT, a.POL_PER_NEXT_DT, a.FA_ACCT_NUM, a.GRP_SALES_OFFC_CD, a.ACCT_C_DT   
FROM  gyv2M.DDM_ACCT_STRUC a   
INNER JOIN  
(SELECT max(DDM_ACCT_STRUC_TP) as   DDM_ACCT_STRUC_TP, FA_CLNT_ID 
 FROM gyv2M.DDM_ACCT_STRUC 
WHERE FA_DM_ROW_DT <= '"+ (DT_WSTR,30)@[User::RepDate] +"'  AND DM_ROW_E_DT <= '"+ (DT_WSTR,30)@[User::RepDate] +"' 
 GROUP BY  FA_CLNT_ID) b 
 ON a.DDM_ACCT_STRUC_TP = b.DDM_ACCT_STRUC_TP AND a.FA_CLNT_ID = b.FA_CLNT_ID AND FA_DM_ROW_DT <= '" +(DT_WSTR,30)@[User::RepDate] +"' AND a.DM_ROW_E_DT <='"+(DT_WSTR,30)@[User::RepDate]+"'"

希望这会有所帮助!

【讨论】:

【参考方案2】:

在你的表达式生成器中试试这个,

 "SELECT a.FA_CLNT_ID, a.FA_ACCT_NM, a.ACCT_E_DT, a.POL_PER_CURR_DT, a.POL_PER_NEXT_DT, a.FA_ACCT_NUM, a.GRP_SALES_OFFC_CD, a.ACCT_C_DT   
FROM  gyv2M.DDM_ACCT_STRUC a   
INNER JOIN  
(SELECT max(DDM_ACCT_STRUC_TP) as   DDM_ACCT_STRUC_TP, FA_CLNT_ID 
 FROM gyv2M.DDM_ACCT_STRUC 
WHERE FA_DM_ROW_DT <= '"+ (DT_WSTR,30)@[User::RepDate] +"'  AND DM_ROW_E_DT <= '"+ (DT_WSTR,30)@[User::RepDate] +"' 
 GROUP BY  FA_CLNT_ID) b 
 ON a.DDM_ACCT_STRUC_TP = b.DDM_ACCT_STRUC_TP AND a.FA_CLNT_ID = b.FA_CLNT_ID AND FA_DM_ROW_DT <= '" +(DT_WSTR,30)@[User::RepDate] +"' AND a.DM_ROW_E_DT <='"+(DT_WSTR,30)@[User::RepDate]+"'"

希望这行得通!

【讨论】:

嘿嘿..抱歉第二次更新。我将变量格式更改为字符串,然后尝试更改您给出的查询。它真的很成功。非常感谢您的帮助。我真的很开心。如有任何问题,将继续发布。

以上是关于如何将参数传递给 ssis 中的 ado.net 源?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ADO.NET 源 SSIS 中传递参数

SSIS Passing Parameters to an ADO .NET Source query;向ado.net数据源传递参数。

将动态表传递给 SSIS 中的 ADO.NET 目标

使用 ADO.NET 传递表值参数

将参数传递给 OLE DB SOURCE

如何将参数传递给scala中的方法