SSIS:从 SQL 到数据流任务的变量

don*_*nDT 6 sql-server oledb ssis etl sql-server-data-tools

总的来说,对 BI 和 SQL 来说还很陌生,但几个月前我什至不知道模型是什么,现在我在这里......试图构建一个每天运行的包。

目前通过 PowerQuery 运行这是 Excel,但由于数据太多,我必须每个月手动更改查询。决定将其移至 SSIS。

所需结果:提取数据库中的最后一个日期并将其用作模型中的变量(因为我有数百万行,我只想加载日期大于表中日期的行)。

这是我的Execute SQL Task在此处输入图片说明 在此处输入图片说明

我为 SQL 查询设置了一个变量 在此处输入图片说明

并尝试在我的 OLE DB 查询中使用它 在此处输入图片说明

Execute SQL Task:结果,很好 - 将日期返回为“dd/mm/yyyy hh24:mi:ss”

SELECT MAX (CONVACCT_CREATE_DATE) AS Expr1 FROM GOMSDailySales
Run Code Online (Sandbox Code Playgroud)

Variable for OLE DB SQL Query

"SELECT fin_booking_code, FIN_DEPT_CODE, FIN_ACCT_NO, FIN_PROD_CODE, FIN_PROG_CODE, FIN_OPEN_CODE, DEBIT_AMT, CREDIT_AMT, CURRENCY_CODE, PART_NO, FIN_DOC_NO, CREATE_DATE
FROM cuown.converted_accounts
WHERE (CREATE_DATE > TO_DATE(@[User::GetMaxDate],'yyyy/mm/dd hh24:mi:ss'))
AND (FIN_ACCT_NO LIKE '1%')"
Run Code Online (Sandbox Code Playgroud)

当前missing expression出现错误,如果我添加" ' "到 my 中,则会@[User::GetMaxDate]出现year must be between 0 and xxxx错误。

我做错了什么/是否有更简洁的方法来完成这项工作?

Had*_*adi 3

在OLEDB源中使用以下命令,将数据访问模式更改为SQL命令,并使用以下命令:

SELECT fin_booking_code, FIN_DEPT_CODE, FIN_ACCT_NO, FIN_PROD_CODE, FIN_PROG_CODE, FIN_OPEN_CODE, DEBIT_AMT, CREDIT_AMT, CURRENCY_CODE, PART_NO, FIN_DOC_NO, CREATE_DATE
FROM cuown.converted_accounts
WHERE (CREATE_DATE > TO_DATE(?,'yyyy/mm/dd hh24:mi:ss'))
AND (FIN_ACCT_NO LIKE '1%')
Run Code Online (Sandbox Code Playgroud)

然后单击参数按钮并映射@[User::GetMaxDate]到第一个参数。

有关详细信息,请检查以下答案:参数化 OLEDB 源查询

替代方法

如果您使用的 OLE DB 提供程序不支持参数,请创建一个字符串类型的变量,并按以下表达式计算该变量:

"SELECT fin_booking_code, FIN_DEPT_CODE, FIN_ACCT_NO, FIN_PROD_CODE, FIN_PROG_CODE, FIN_OPEN_CODE, DEBIT_AMT, CREDIT_AMT, CURRENCY_CODE, PART_NO, FIN_DOC_NO, CREATE_DATE
FROM cuown.converted_accounts
WHERE CREATE_DATE > TO_DATE('" + (DT_WSTR, 50)@[User::GetMaxDate] +
"' ,'yyyy/mm/dd hh24:mi:ss') AND FIN_ACCT_NO LIKE '1%'"
Run Code Online (Sandbox Code Playgroud)

然后从 OLE DB 源中,更改来自变量的 SQL 命令的数据访问模式,并选择您创建的字符串变量。