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 中实现这一点,您需要执行如下操作:
创建三个变量,如下图所示:
循环 @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})
我正在尝试基于本地数据库中包含“日期+静态描述”,例如:“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 中实现这一点,您需要执行如下操作:
创建三个变量,如下图所示:
循环
@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})