我无法在Mule Database连接器上使用“当与源不匹配时”子句。 即使不满足子句条件,也会执行“当与源不匹配时”子句中的操作。
我做了很少的示例项目来进一步说明情况。我正在使用sql-server和Mule 3.9.0。
这是源表:
将所有对象从该表移至目标表。在目标表中,还有一个附加标志值“ isDeleted”,其想法是在从源中删除行时将其设置为1。
这是实际的合并子句:
MERGE [mergetest_target] AS target USING( SELECT #[payload.get("id")] AS id, #[payload.get("text")] AS text ) AS SOURCE ON (target.id = source.id) WHEN NOT MATCHED BY SOURCE THEN UPDATE SET isDeleted = 1 WHEN MATCHED THEN UPDATE SET text = source.text, isDeleted = 0 WHEN NOT MATCHED BY TARGET THEN INSERT (id, text, isDeleted) VALUES (source.id, source.text, 0) ;
第一个驱动器中的结果应该是将源表中的所有行都移到目标表中,并且所有“ isDeleted”值均为0。
实际结果非常不同。这是第一次运行后的目标表
因此,所有行都已移动,但除一行以外的所有行的“ isDeleted”都为1。
我对这个结果感到很困惑。 如果有人可以帮助我理解此结果,并可能修复我的merge子句。
感谢所有帮助。谢谢
以下是完整的Mule配置xml:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">
<flow name="mergetestFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/mergetest" doc:name="HTTP"/>
<db:select config-ref="PowerBI_AzureSQL" doc:name="Database">
<db:parameterized-query><![CDATA[Select * from mergetest_source;]]></db:parameterized-query>
</db:select>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<db:update config-ref="PowerBI_AzureSQL" bulkMode="true" doc:name="Database">
<db:parameterized-query><![CDATA[MERGE [mergetest_target] AS target
USING(
SELECT
#[payload.get("id")] AS id,
#[payload.get("text")] AS text
) AS SOURCE ON (target.id = source.id)
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET
isDeleted = 1
WHEN MATCHED THEN
UPDATE SET
text = source.text,
isDeleted = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT
(id, text, isDeleted)
VALUES
(source.id, source.text, 0)
;]]></db:parameterized-query>
</db:update>
</flow>
</mule>