Azure Data Factory Error: "incorrect syntax near"

Azure Data Factory Error: "incorrect syntax near"

我正在尝试基于本地数据库中包含“日期+静态描述”,例如:“20210314MetroFactory”

1- 我使用在 Azure SQL 数据库中创建的 table 创建了一个名为 Lookup1 的查找 activity,并使用此查询

"Select 来自 SubsetwatermarkTable 的 RP"

2- 我创建了一个复制数据 activity,其中源设置有这个查询

"Select * 来自 SourceDevSubsetTable WHERE RP NOT IN '@{activity('Lookup1').output.value}'"

调试时 -- 我收到错误:

故障类型:用户配置问题

Details: Failure happened on 'Source' side. 'Type=System.Data.SqlClient.SqlException,Message=Incorrect syntax near '[{"RP":"20210307_1Plant 1KAO"},{"RP":"20210314MetroFactory"},{"RP":"20210312MetroFactory"},{"RP":"20210312MetroFactory"},{"RP":"2'.,Source=.Net SqlClient Data Provider,SqlErrorNumber=102,Class=15,ErrorCode=-2146232060,State=1,Errors=[{Class=15,Number=102,State=1,Message=Incorrect syntax near '[{"RP":"20210311MetroFactory"},{"RP":"20210311MetroFactory"},{"RP":"202103140MetroFactory"},{"RP":"20210308MetroFactory"},{"RP":"2'.,},],'

任何人都可以告诉我我做错了什么以及如何解决它,即使它需要创建更多活动。

注意:table 中没有 LastModifiedDate 列。此外,我还没有创建将在完成增量副本时更新查找 table 的 StoredProcedure。

@activity('Lookup1').output.value 的结果是一个数组,如您的错误所示

[{"RP":"20210307_1Plant 1KAO"},{"RP":"20210314MetroFactory"},{"RP":"20210312MetroFactory"},{"RP":"20210312MetroFactory"},{"RP":"2'.,Source=.Net SqlClient Data Provider,SqlErrorNumber=102,Class=15,ErrorCode=-2146232060,State=1,Errors=[{Class=15,Number=102,State=1,Message=Incorrect syntax near '[{"RP":"20210311MetroFactory"},{"RP":"20210311MetroFactory"},{"RP":"202103140MetroFactory"},{"RP":"20210308MetroFactory"},{"RP":"2'.,},]

但是,你的SQL应该是这样的:Select * from SourceDevSubsetTable WHERE RP NOT IN ('20210307_1Plant 1KAO','20210314MetroFactory',...).

要在 ADF 中实现这一点,您需要执行如下操作:

  1. 创建三个变量,如下图所示:

  2. 循环 @activity('Lookup1').output.value 的结果并将 'item().RP' 附加到数组值:

表达式:@activity('Lookup1').output.value

表达式:@concat(variables('apostrophe'),item().RP,variables('apostrophe'))

3.cast arrayvalues 到字符串并通过设置变量添加括号 activity 表达式:@concat('(',join(variables('arrayvalues'),','),')')

4.copy 到您的 Azure SQL 数据库 表达式:Select * from SourceDevSubsetTable WHERE RP NOT IN @{variables('stringvalues')}

史蒂夫关于失败的原因以及您在复制数据中需要的查询是正确的。

正如他所说,您希望在 IN 子句中使用逗号分隔的引用值列表。

不过您可以更轻松地获得此信息 - 使用此查询直接从您的查找中获取:-

select stuff(
  (
    select ','''+rp+''''
    from   subsetwatermarktable
    for    xml path('')
  )
  , 1, 1, ''
) as in_clause

子查询获取逗号分隔的列表,每个 rp 值都用引号括起来,但开头有一个虚假的逗号 - 使用 stuff 的外部查询删除了这个。

现在勾选“查找”中的“仅限第一行”框,并将“复制数据源”查询更改为:

select *
from   SourceDevSubsetTable
where  rp not in (@{activity('lookup').output.firstRow.in_clause})