这是连接到 salesforce 的 ADF 管道中。
使用 REPLACE()、TRANSLATE() 等常见 tsql 函数会导致错误。
目标:从长文本字段中清除特殊字符,例如换行符和正在写入的文件的分隔符。
问题:
通过此查询,管道运行没有错误,但文件已损坏:
SELECT
Id,
longtextfield
FROM
exampleTable
我已经尝试过:
REPLACE(longtextfield, '|', '') AS longtextfield
CAST(REPLACE(longtextfield, '|', '') AS varchar(5000)) AS longtextfield
REPLACE(ISNULL(longtextfield, ''), '|', '')
TRANSLATE(longtextfield, '|', '')
以及其他变体。他们都失败并显示此错误消息:
错误 [HY000] [Microsoft][Salesforce] (120) SOQL_FIRST 模式准备失败: SOQL 错误:[Microsoft][SQLEngine] (31480) 'SELECT ISNULL(<<< ??? >>>Subject,'') AS testname FROM exampletable
附近存在语法错误
当然我已经仔细验证了表名、对象名等是否正确,但我无法确定任何实际的语法错误,看来是使用tsql语句本身导致了错误。
我已经看到这些函数在我们组织中非常相似的管道中成功使用(在其他对象和字段上)。这些管道非常简单,只有 1 个副本数据活动查询和写入文件。
我不太熟悉 tsql-soql 翻译的工作原理,在该级别是否有某些东西可能会拒绝该函数?
SOQL 不支持 REPLACE 函数或其他通用文本操作函数。 [注意:SOQL 和 t-SQL 是不同的]。 SOQL 中的可用函数在官方文档中列出。
解决方法是将数据复制到 azure 数据库/azure 存储,然后使用 ADF 数据流活动对其进行转换,然后将转换后的数据复制到接收器。在数据流中,您可以使用派生列转换来重新定义列。在派生列转换中,使用 replace 函数
replace(longtextfield,'|','')
这样,您就可以替换数据中的字符。