SSIS 查找任务 - 以编程方式设置 SQL 命令
本文关键字:方式 设置 SQL 命令 编程 查找 任务 SSIS | 更新日期: 2023-09-27 18:32:15
当尝试使用 C# 以编程方式将 SQLCommand 设置为SSIS 中的查找任务时,我发现了解决方法。
原始问题:在设计时直接通过查找任务
CManagedComponentWrapper designTime = lookupTask.Instantiate();
designTime.ProvideComponentProperties();
designTime.SetComponentProperty("SqlCommand", lookupQuery);
designTime.SetComponentProperty("SqlCommandParam", lookupQuery);
新问题:通过托管查找转换任务的数据流任务:
satelliteDft.SetExpression("[MyLookup].[SqlCommand]", lookupQuery);
satelliteDft.SetExpression("[MyLookup].[SqlCommandParam]", lookupQuery);
问题是,即使在执行数据流任务时,当我打开新创建的包时,select 语句也不会显示在查找任务中。
编辑:
下面的解决方案不会修改查找任务中的实际值,即使数据流属性确实已更改也是如此。数据流任务中可用于修改的属性如下:
[MyLookup].[SqlCommand]
[MyLookup].[SqlCommandParam]
AutoGenerateIDForNewObjects
BLOBTempStoragePath
BufferManager
BufferTempStoragePath
ComponentMetaDataCollection
CreationName
DefaultBufferMaxRows
DefaultBufferSize
DelayValidation
Description
Disable
DisableEventHandlers
EngineThreads
EventHandlers
EventInfos
Events
ExecutionDuration
ExecutionResult
ExecutionStatus
FailPackageOnFailure
FailParentOnFailure
ForcedExecutionValue
ForceExecutionResult
ForceExecutionValue
ID
IsDefaultLocaleID
IsolationLevel
LocaleID
LogEntryInfos
LoggingMode
LoggingOptions
MaximumErrorCount
Name
Parent
PathCollection
RunInOptimizedMode
StartTime
StopTime
TransactionOption
VariableDispenser
Variables
我认为这个想法是能够使用其中一个来设置表达式的值。
由于您是直接设置表达式而不是任务属性,因此必须将查询放在引号中,以便正确设置表达式并可由 SSIS 计算。
所以像
satelliteDft.SetExpression("[MyLookup].[SqlCommand]", string.Format("'"{0}'"", lookupQuery));
应该会更好。
更新:所以首先让我们把术语弄清楚。
在 SSIS 中,有表达式和属性。
要影响的属性是 MyLookup 任务的 SqlCommand 属性。您可以通过三种方式影响这一点:
- 直接设置查找任务的属性。
- 设置属性 [我的查找]。[SqlCommand] 直接包含查找任务的数据流任务。
- 设置 [我的查找] 的表达式值。数据流任务中的 [SqlCommand] 属性。
第 1 点和第 2 点正在修改完全相同的属性 - 查找任务的 SQLCommand 属性。如果更改任一选项,则可以在 GUI 的另一个框中查看更改结果。值本身仅存储在 XML 中的一个位置 - 作为查找组件元素的 SQLCommand 属性元素的文本值。
第三个比较棘手。在 GUI 中设置它时,它还会将计算表达式的值设置为查找任务的 SQLCommand 属性。它在引擎盖下做到这一点。当您以编程方式执行此操作时,它不会执行此底层评估和属性设置,因此不会执行错误。
这与设置 [MyLookup] 时遇到的问题相同。数据流任务上的 [SqlCommand] 属性 - 未传播到查找任务。