SSIS:从 SQL 到数据流任务的变量
SSIS: Variable from SQL to Data Flow Task
对 BI 和 SQL 来说是一个新手,但几个月前我什至不知道什么是模型,现在我正在...尝试构建一个每天运行的程序包。
目前 运行 这是 Excel 通过 PowerQuery,但由于数据太多,我必须每个月手动更改查询。决定将其移至 SSIS。
要求的结果:在我的数据库中提取最后一个日期并将其用作模型中的变量(因为我有数百万行,我只想加载日期大于我在 table 已经)。
这是我的Execute SQL Task
:
我为 SQL 查询设置了一个变量
并尝试像这样在我的 OLE DB 查询中使用它
Execute SQL Task
:结果,很好 - returns 日期为 "dd/mm/yyyy hh24:mi:ss"
SELECT MAX (CONVACCT_CREATE_DATE) AS Expr1 FROM GOMSDailySales
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%')"
当前出现 missing expression
错误,如果我将 " ' "
添加到我的 @[User::GetMaxDate]
,我会收到 year must be between 0 and xxxx
错误。
我做错了什么/有没有更简洁的方法来完成这项工作?
您试图将 SSIS 变量用作查询中的变量。在字符串变量中构建 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 > " + @[User::GetMaxDate] +
"AND (FIN_ACCT_NO LIKE '1%')"
在 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%')
然后单击参数按钮并将 @[User::GetMaxDate]
映射到第一个参数。
有关详细信息,请查看以下答案:Parameterized OLEDB source query
替代方法
如果您使用的 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%'"
然后从 OLE DB 源,更改数据访问模式 SQL 来自变量 的命令和 select 您创建的字符串变量。
对 BI 和 SQL 来说是一个新手,但几个月前我什至不知道什么是模型,现在我正在...尝试构建一个每天运行的程序包。
目前 运行 这是 Excel 通过 PowerQuery,但由于数据太多,我必须每个月手动更改查询。决定将其移至 SSIS。
要求的结果:在我的数据库中提取最后一个日期并将其用作模型中的变量(因为我有数百万行,我只想加载日期大于我在 table 已经)。
这是我的Execute SQL Task
:
我为 SQL 查询设置了一个变量
并尝试像这样在我的 OLE DB 查询中使用它
Execute SQL Task
:结果,很好 - returns 日期为 "dd/mm/yyyy hh24:mi:ss"
SELECT MAX (CONVACCT_CREATE_DATE) AS Expr1 FROM GOMSDailySales
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%')"
当前出现 missing expression
错误,如果我将 " ' "
添加到我的 @[User::GetMaxDate]
,我会收到 year must be between 0 and xxxx
错误。
我做错了什么/有没有更简洁的方法来完成这项工作?
您试图将 SSIS 变量用作查询中的变量。在字符串变量中构建 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 > " + @[User::GetMaxDate] +
"AND (FIN_ACCT_NO LIKE '1%')"
在 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%')
然后单击参数按钮并将 @[User::GetMaxDate]
映射到第一个参数。
有关详细信息,请查看以下答案:Parameterized OLEDB source query
替代方法
如果您使用的 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%'"
然后从 OLE DB 源,更改数据访问模式 SQL 来自变量 的命令和 select 您创建的字符串变量。