如何在 SSIS 包中使用变量和 SQL 代码?

Posted

技术标签:

【中文标题】如何在 SSIS 包中使用变量和 SQL 代码?【英文标题】:How can I use variables and SQL code within an SSIS package? 【发布时间】:2015-06-15 19:47:27 【问题描述】:

我正在构建一个 SSIS 包,用于从 .CSV 文件中获取数据并将其加载到 SQL Server 数据库中的表中。 .CSV 文件的列比我的表多,我希望根据其中一些未插入到表中的列来过滤掉数据。

我在.CSV 文件中将年份、种类、类型、美元作为列名,但我只是将类型和美元提取到数据库中。但是,我只能拉出 kind="L" 和 year 是当前年份的那些行(有一个主要警告)。如果该过程在给定年份的第一季度(因此月份 .CSV 文件中提取的行的限定符。例如,假设这个包在 2015 年 2 月运行,我需要它从我的 .CSV 文件中只提取 2014 年和 kind="L" 的行。如果是 2015 年 9 月,那么它需要以 2015 年和 kind="L" 拉入行。

知道最好的方法是什么吗?现在我的包中有条件拆分,但我只能说 year==YEAR(GETDATE()) 并且这不适用于第一季度。我需要某种变量逻辑来表达IF(currentmonth<=3 THAN @year = currentyear-1) ELSE (@year = currentyear) 之类的内容,然后在条件拆分中使用@year 变量。这可能吗?

非常感谢任何帮助!

【问题讨论】:

我发现当我的逻辑越来越复杂的时候,Script组件的使用越来越合适了。我建议对filter your data flow based on your logic 使用脚本组件。您可以控制将哪些数据发送到哪些输出。 (并且只使用包含“好”数据的输出。) 我发现当我的逻辑变得越来越复杂时,使用数据库逻辑是最合适的:)(即根据@maxymoo响应) 【参考方案1】:

通常对于这种工作流,我会将整个 CSV 导入到一个临时表中,然后有一个单独的 SQL 脚本或视图从临时表中读取并应用最终视图所需的任何业务逻辑。

【讨论】:

【参考方案2】:

如果您希望逻辑位于 SSIS 包中,您可以使用派生列组件来声明一个新的布尔字段,例如 IncludeRowInOutput 并将其设置为类似

((currentmonth <= 3 and year = year(getdate() - 1)) or (year = year(getdate))) and kind = 'L'

然后可以根据IncludeRowInOutput字段进行条件拆分。

我通常会警惕使用过多的脚本组件,我发现它们更难调试并使数据流更难理解。

【讨论】:

以上是关于如何在 SSIS 包中使用变量和 SQL 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SSIS 包中检索 SQL Server 实例名称

在 SQL Server 表中转储 SSIS USER 变量名称和值

在 SSIS .dtsx 包中查找表名

SSIS 包中的 C# 脚本在 SQL Server 表的数据执行过程中挂起,没有明确的错误消息

安装SSIS包中的数据流任务

在SSIS包中使用AD服务帐户