这是原始查询,使用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点击优惠..&gt;表达式..&gt;等..成功地评估了表达式。表达看起来如下,但我被击中了。接下来是什么 ?如何在ado.net源中将计算表达式作为源命令传递?请帮忙。
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 with datetime和execute sql task,它将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
数据流任务错误[ADO NET源[1]]:组件“ADO NET Source”(1)无法检索SQL命令的列信息。发生以下错误:ERROR [22007] [IBM] [CLI驱动程序] [DB2] SQL0180N日期时间值的字符串表示的语法不正确。 SQLSTATE = 22007
其他信息:
管道组件已从方法调用返回HRESULT错误代码0xC02020FF。 (Microsoft.SqlServer.DTSPipelineWrap)
按钮:
答案 0 :(得分:8)
您可以使用以下步骤:
Dataflow
,然后点击Properties
。SqlCommand
,然后使用“表达式”构建器使用SSIS变量(在您的情况下为datetime变量)准备查询。
在表达式构建器中尝试此操作 - 请注意,您的变量必须是字符串,如果不是,则使用(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]+"'"
希望这有帮助!
答案 1 :(得分:0)
在表达式构建器中尝试此操作
"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]+"'"
希望这有效!