1

在尝试使用 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

我认为这个想法是能够使用其中之一来设置表达式的值。

4

1 回答 1

3

由于您正在设置表达式而不是直接设置任务属性,因此您必须将查询放在引号中,以便正确设置表达式并且可以由 SSIS 评估。

所以像

satelliteDft.SetExpression("[MyLookup].[SqlCommand]", string.Format("\"{0}\"", lookupQuery));

应该会更好。

更新:首先让我们直接了解术语。

在 SSIS 中,有表达式,也有属性。

您要影响的属性是 MyLookup 任务的 SqlCommand 属性。您可以通过三种方式影响这一点:

  1. 直接在查找任务上设置属性。
  2. 直接在包含查找任务的数据流任务上设置属性 [MyLookup].[SqlCommand]。
  3. 在数据流任务中设置 [MyLookup].[SqlCommand] 属性的表达式值。

第 1 点和第 2 点正在修改完全相同的属性 - 查找任务的 SQLCommand 属性。如果您更改其中任何一个,您可以在 GUI 的另一个框中看到更改的结果。该值本身仅存储在 XML 中的一处 - 作为 Lookup 组件元素的 SQLCommand 属性元素的文本值。

第三个更棘手。当您在 GUI 中设置它时,它还将计算表达式的值设置为查找任务的 SQLCommand 属性。它在引擎盖下做到了这一点。当您以编程方式执行此操作时,它不会执行此底层评估和属性设置,因此您的错误。

这与您在数据流任务上设置 [MyLookup].[SqlCommand] 属性时遇到的问题相同 - 不会传播到 Lookup 任务。

于 2013-09-22T02:39:14.053 回答