在Azure Data Factory中通过查询获取Salesforce表含归档及删除记录的方法咨询及报错排查
嗨,我来帮你解决这个问题!你遇到的语法错误是因为Microsoft Salesforce ODBC Driver对SOQL的ALL ROWS子句解析存在兼容性问题——虽然SELECT * FROM test ALL ROWS是标准的Salesforce SOQL语法,但ODBC驱动并不完全支持这种写法,所以才会抛出语法错误。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:使用ADF内置Salesforce连接器(最推荐)
如果你还在使用ODBC连接Salesforce,建议切换到ADF原生的Salesforce连接器,它对Salesforce的特性支持更友好:
- 在ADF中创建新的Salesforce数据集,配置好连接信息
- 进入数据集的"Source"配置页,找到**"Include deleted and archived records"**选项并勾选它
- 然后直接编写常规的SOQL查询即可,不需要加
ALL ROWS:
SELECT * FROM test
这样就能自动获取包括归档、已删除(回收站)在内的所有记录。
方案2:调整ODBC查询的写法
如果必须使用ODBC驱动,可以尝试两种替代写法:
写法A:通过字段筛选所有记录
直接查询所有包含已删除和未删除的记录(适用于大部分Salesforce对象):
SELECT * FROM test WHERE IsDeleted = TRUE OR IsDeleted = FALSE
注意:对于有IsArchived字段的对象(比如Task、Event),还需要加上IsArchived的筛选:
SELECT * FROM test WHERE (IsDeleted = TRUE OR IsDeleted = FALSE) AND (IsArchived = TRUE OR IsArchived = FALSE)
写法B:使用ODBC驱动支持的调用格式
部分版本的Microsoft Salesforce ODBC Driver需要用{CALL ...}包裹SOQL查询,你可以尝试这种写法:
{CALL SELECT * FROM test ALL ROWS}
如果还是不行,建议升级你的ODBC驱动到最新版本,新版本通常会修复更多SOQL语法兼容性问题。
报错原因补充
你看到的错误提示SOQL error: [Microsoft][SQLEngine] (31480) syntax error near 'SELECT Id FROM test ALL ROWS',本质是ODBC引擎无法识别Salesforce特有的ALL ROWS子句——ODBC驱动是将SQL转换为SOQL的中间层,它对Salesforce的非标准SQL语法支持有限,这就是为什么直接用标准SOQL会报错。
备注:内容来源于stack exchange,提问作者Herwini

