参数太少。预计2在Talend

时间:2014-10-06 10:01:48

标签: sql ms-access talend

我在ms-access 2013中触发了一个更新查询。但是这个更新查询将针对不同条件的不同行执行。我知道在Access中我们不能使用“CASE ... WHEN”条件。在访问中我们需要转到 Switch() function.Below是我的更新查询:

UPDATE T_Generated_OpportunityLine SET IsUploadable = Switch(
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c>=5000,"Y",
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c<5000,"N",
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c>=5000,"Y",
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c<5000,"N",
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c>=30000,"Y",
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c<30000,"N",
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c>=25000,"Y",
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c<25000,"N",
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c>=15000,"Y",
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c<15000,"N");

此查询从访问2013开始正常运行。但是当我在“ tAccessRow ”元素中的 Talend5.4 中使用此查询时,我将收到以下内容错误:

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2

在更新之前,我的表格行如下所示:

    LowestLevelInPyramid_c  Lowestlevelvalue_c          LineStatus_c    Quantity_c  Amount_c    LineClosedate_c  IsUploadable
    ProductLine             PTLRC -Swiss CCO Standards  Pending         1           9600        11/21/2013  

更新后将

    LowestLevelInPyramid_c  Lowestlevelvalue_c          LineStatus_c    Quantity_c  Amount_c    LineClosedate_c  IsUploadable
    ProductLine             PTLRC -Swiss CCO Standards  Pending         1           9600        11/21/2013       Y/N

“Y / N”将根据上述查询中说明的条件进行评估。这一行代表的是OpportunLine.Through update我正在确定某个特定行是否可以上传到客户端CRM系统或不是。如果它是'Y',那么如果它是“N”它将是可上传的,那么它将无法上传。

任何人都可以为此提供任何合适的解决方案吗?

3 个答案:

答案 0 :(得分:1)

通常,这种转换通常在tMap或tJavaRow组件中完成,而不是尝试在DML语句中嵌套一堆逻辑。这应该使它更适合未来的变化,并且通过这样的简单转换,性能往往非常好,因为Talend不需要缓冲整个数据集并且可以从源读取,转换和更新流中的目标。

当处理非常大的数据集(通常是100万行+)时,您可能更愿意将数据保留在数据库中并使用数据库行组件或更好的Talend提供的ELT组件在那里执行转换。 p>

一个非常简单的ETL作业设置可能类似于:

Sample job layout

此作业连接到MySQL数据库,然后将表中的所有数据拉入模式。

作业的主要部分发生在具有如下配置的tMap中:

tMap variable configuration

在上面的屏幕截图中,我创建了一个变量,用于计算某些内容是否可上传,因此它是true。对于每种类型的LowestLevelValue_c重复此操作。

最后我们在IsUploadable

的值中使用了三元运算符

IsUploadable ternary operator

如果任何变量为true,则IsUpload设置为“Y”,否则设置为“N”。

然后,我的工作的其余部分使用tLogRow将结果打印到控制台,但您可以使用tAccessOutput组件集来更新Access数据库。确保已将模式配置为具有要更新的唯一密钥(在这种情况下,如果缺少表的唯一主键,则可能使用LowestLevelValue_cAmount_c

答案 1 :(得分:0)

正如您所猜测的那样,问题在于Switch()功能。这是一个VBA函数,而不是本机Jet / ACE SQL函数。这就是为什么它可以从Access工作而失败来自Talend。

要完成这项工作,您需要将Switch()语句翻译为嵌套IIf()IIf()是本机Jet / ACE语句。它会比Switch()函数稍微丑一些,但实际上应该更好,因为它使用短路布尔逻辑。

答案 2 :(得分:0)

我已经解决了这个问题。问题出在&#34; Y / N&#34; 。在Talend,我们需要使用&#39; Y&#39;或者&#39; N&#39; 。我修改过的查询结构如下所示:

UPDATE T_Generated_OpportunityLine SET IsUploadable = Switch(
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c>=5000,'Y',
Lowestlevelvalue_c='PTLRC -Swiss CCO Standards' AND Amount_c<5000,'N',
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c>=5000,'Y',
Lowestlevelvalue_c='PTWDA -Swiss WDE Standards' AND Amount_c<5000,'N',
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c>=30000,'Y',
Lowestlevelvalue_c='PTFDS - FD ENCLOSURE SYSTEMS' AND Amount_c<30000,'N',
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c>=25000,'Y',
Lowestlevelvalue_c='PTCMS - CABLE MNGT SYSTEMS' AND Amount_c<25000,'N',
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c>=15000,'Y',
Lowestlevelvalue_c='DOOR ENTRY SYSTEM' AND Amount_c<15000,'N');