如何在SSIS中使用包变量放置where条件

问题描述 投票:0回答:2

我创建了一个 ssis 包 我需要运行以下查询

Insert into  mydata.dbo.MonthEndCDSSpreadCalc(Date,CompanyName)
SELECT    Date, CompanyName
FROM       mydata.dbo.UpdateNAV
WHERE     (Date = @[User::Date]) AND (PortfolioId = @[User::PortfolioId]) AND (SecurityType in (@[User::SecurityType]))

但在上面我在用户变量处遇到错误。 将以上查询运行到

SQL Task
请告诉我如何正确使用它们?

ssis
2个回答
3
投票

如果它应该是控制流内的任务,请使用 ExecuteSQL 任务。 如果它应该是数据流内的任务,请使用 OleDbCommand。

此外,无论您选择哪一个,都应该更改查询以使用适当的参数语法。查看 BOL for ExecuteSQL 任务和 OleDbCommand 了解详细说明。

例如,如果您在 oledbcommand 中使用 oledb 连接管理器,您应该使用 ?只是因为那是 oledb 参数占位符:

Insert into  mydata.dbo.MonthEndCDSSpreadCalc(Date,CompanyName)
SELECT    Date, CompanyName
FROM       mydata.dbo.UpdateNAV
WHERE     (Date = ?) AND (PortfolioId = ?) AND (SecurityType in ?)

然后转到参数选项卡并将参数映射到 SSIS 变量。请注意,SSIS 按照您列出的顺序将您的 SSIS 变量映射到查询中的问号。

注意:如果你有很多行,这个包将会非常慢。最好不要逐行处理,而是更改包的逻辑,以便它可以与集合一起使用(例如,在数据流中分配值并使用 oledb 目标将数据插入 MonthEndCDSSpreadCalc)。


0
投票

您可以采用条件拆分来写入逐行检查的

WHERE
条件,并在数据流中打印通过的数字:

如您所见,您还可以选择变量作为输入。

在变量“不”满足的情况下写入布尔条件。也就是说,该框中所有变为 TRUE 的内容都不会被传递。然后在条件分割默认输出中,您将拥有内部框的布尔条件为 false 的那些行,因此,整个其余部分将在没有布尔检查的情况下通过。 请参阅在 SSIS 中使用条件拆分处理空值中的示例。

© www.soinside.com 2019 - 2024. All rights reserved.