Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将sql server与mule合并?_Mule_Mule Studio - Fatal编程技术网

如何将sql server与mule合并?

如何将sql server与mule合并?,mule,mule-studio,Mule,Mule Studio,我已经用foreach和executedll操作完成了这项工作,但是当尝试插入一个字符串并将其更新时,抛出一个exeption,但是使用int值可以工作 exeption:`异常堆栈是: 1. Invalid column name 'Carlos'. (com.microsoft.sqlserver.jdbc.SQLServerException) com.microsoft.sqlserver.jdbc.SQLServerException:217 (null) 2. Invalid c

我已经用foreach和executedll操作完成了这项工作,但是当尝试插入一个字符串并将其更新时,抛出一个exeption,但是使用int值可以工作

exeption:`异常堆栈是:

1. Invalid column name 'Carlos'. (com.microsoft.sqlserver.jdbc.SQLServerException)
  com.microsoft.sqlserver.jdbc.SQLServerException:217 (null)
2. Invalid column name 'Carlos'. (com.microsoft.sqlserver.jdbc.SQLServerException). Message payload is of type: LinkedHashMap (org.mule.api.MessagingException)
  org.mule.module.db.internal.processor.AbstractDbMessageProcessor:93 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html)
********************************************************************************
Root Exception stack trace:
com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'Carlos'.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1635)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:865)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:762)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:6276)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1793)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:184)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:159)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeUpdate(SQLServerStatement.java:2198)
    at org.mule.module.db.internal.domain.autogeneratedkey.NoAutoGeneratedKeyStrategy.executeUpdate(NoAutoGeneratedKeyStrategy.java:59)
    at org.mule.module.db.internal.domain.executor.UpdateExecutor.doExecuteQuery(UpdateExecutor.java:43)
    at org.mule.module.db.internal.domain.executor.UpdateExecutor.doExecuteQuery(UpdateExecutor.java:37)
    at org.mule.module.db.internal.domain.executor.AbstractSingleQueryExecutor.execute(AbstractSingleQueryExecutor.java:38)
    at org.mule.module.db.internal.processor.ExecuteDdlMessageProcessor.doExecuteQuery(ExecuteDdlMessageProcessor.java:53)
    at org.mule.module.db.internal.processor.AbstractSingleQueryDbMessageProcessor.executeQuery(AbstractSingleQueryDbMessageProcessor.java:42)
    at org.mule.module.db.internal.processor.AbstractDbMessageProcessor.process(AbstractDbMessageProcessor.java:66)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:24)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:107)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44)
    at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:98)
    at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59)
    at org.mule.routing.outbound.AbstractMessageSequenceSplitter.processParts(AbstractMessageSequenceSplitter.java:129)
    at org.mule.routing.outbound.AbstractMessageSequenceSplitter.process(AbstractMessageSequenceSplitter.java:59)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:24)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:107)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44)
    at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:88)
    at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:24)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:107)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44)
    at org.mule.routing.Foreach.process(Foreach.java:94)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:24)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:107)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44)
    at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:88)
    at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:24)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44)
    at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:98)
    at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59)
    at org.mule.interceptor.AbstractEnvelopeInterceptor.processBlocking(AbstractEnvelopeInterceptor.java:58)
    at org.mule.processor.AbstractRequestResponseMessageProcessor.process(AbstractRequestResponseMessageProcessor.java:47)
    at org.mule.processor.AsyncInterceptingMessageProcessor.processNextTimed(AsyncInterceptingMessageProcessor.java:123)
    at o...
********************************************************************************
`
“Carlos”是来自有效负载的值

这是DLL

BEGIN MERGE [FP].[Profile] AS DESTINO USING (SELECT #[payload.ID]) AS
FUENTE (ID) ON (DESTINO.ID=FUENTE.ID) WHEN MATCHED THEN UPDATE SET 
[UserId]= #[payload.UserId] WHEN NOT MATCHED THEN INSERT 
(ID,UserId,ExternalId,FirstName) VALUES (#[payload.ID],#
[payload.UserId],#[payload.ExternalId],#[payload.FirstName]); END
XML流:

<flow name="insertprofilesindwFlow">
    <file:inbound-endpoint path="C:\Users\LBonaventura\Documents\MuleFilesFromDB" responseTimeout="10000" doc:name="Read the file with the profiles" moveToDirectory="C:\Users\LBonaventura\Documents\MuleFilesFromDB" pollingFrequency="864000000"/>
     <dw:transform-message metadata:id="57e39ab0-6c79-4118-a57e-fe6561a04e9b" doc:name="Transform Message  to map">
        <dw:input-payload doc:sample="list_csv_1.csv"/>
        <dw:set-payload><![CDATA[%dw 1.0 %output application/java ---payload map ((payload01 , indexOfPayload01) -> {


ID: payload01.ID,

ExternalId: payload01.ID as :string,
UserId: payload01.UserId,

FirstName: payload01.FirstName,


LastName: payload01.LastName,



(DateOfBirth: payload01.DateOfBirth as :string) when payload01.DateOfBirth != "",


(DateOfBirth: null) when payload01.DateOfBirth=="",



(Gender:"M") when  payload01.Gender=="1",


(Gender:"F") when  payload01.Gender=="0",


(Gender:null) when payload01.Gender=="",




AllowTracking: payload01.AllowTracking,


Email: payload01.AlertEmail, 

MainProfile: payload01.Main,


Active: payload01.Active as :boolean,
CreatedOn: payload01.DateAdded as :string,
UpdatedOn: payload01.DateUpdated as :string,


LanguageIso: "ESP",


Deleted: false})]]></dw:set-payload>
    </dw:transform-message>
    <foreach doc:name="For Each Profile">
        <db:execute-ddl config-ref="FOX_DW_DATABASE_CONFIGURATION" doc:name="Upsert in the Database">
            <db:dynamic-query><![CDATA[BEGIN MERGE [FP].[Profile] AS DESTINO
USING (SELECT #[payload.ID]) AS FUENTE (ID)
ON (DESTINO.ID=FUENTE.ID)
WHEN MATCHED THEN
    UPDATE SET 

        [UserId]= #[payload.UserId],
        [FirstName]=#[payload.FirstName]


WHEN NOT MATCHED THEN

    INSERT 
        (ID,UserId,ExternalId,[FirstName])
    VALUES
       (#[payload.ID],#[payload.UserId],#[payload.ExternalId],#[payload.FirstName]); END]]></db:dynamic-query>
        </db:execute-ddl>
    </foreach>

</flow>

{
ID:payload01.ID,
ExternalId:payload01.ID为:字符串,
UserId:payload01.UserId,
名字:payload01.FirstName,
LastName:payload01.LastName,
(DateOfBirth:payload01.DateOfBirth as:string)当payload01.DateOfBirth!=“”,
(DateOfBirth:null)当payload01.DateOfBirth==“”,
(性别:“M”)当payload01.性别==“1”,
(性别:“F”)当payload01.性别==“0”,
(性别:空)当payload01.Gender==“”,
AllowTracking:payload01.AllowTracking,
电子邮件:payload01.AlertEmail,
MainProfile:payload01.Main,
活动:payload01。活动为:布尔,
CreatedOn:payload01.DateAdded为:字符串,
UpdateOn:payload01.Date更新为:字符串,
语言ISO:“ESP”,
已删除:false}]>

在使用动态查询时,没有参数转换,因此您需要在字符串参数中添加引号,因此在您的情况下,它应该如下所示:

<db:dynamic-query><![CDATA[BEGIN MERGE [FP].[Profile] AS DESTINO
USING (SELECT #[payload.ID]) AS FUENTE (ID)
ON (DESTINO.ID=FUENTE.ID)
WHEN MATCHED THEN
    UPDATE SET 
        [UserId]= '#[payload.UserId]',
        [FirstName]=#[payload.FirstName]
WHEN NOT MATCHED THEN
    INSERT 
        (ID,UserId,ExternalId,[FirstName])
    VALUES
       (#[payload.ID],'#[payload.UserId]',#[payload.ExternalId],'#[payload.FirstName]'); END]]></db:dynamic-query>


关于安全性,只需注意一点:使用动态查询时,您很容易受到这种方式的SQL注入的攻击,因此请确保在将此参数传递到DLL之前对其进行清理。

此处的操作:>开始将[FP].[Profile]合并为DESTINO using(选择#[payload.ID])作为FUENTE(ID)on(DESTINO.ID=FUENTE.ID)匹配时,更新集[UserId]=#[payload.UserId],不匹配时,插入(ID,UserId,ExternalId,FirstName)值(#[payload.ID],#[payload.UserId],#[payload.ExternalId],#[payload.FirstName]);您可以发布完整的xml流吗?这可能有助于您尝试在不使用方括号的情况下编写查询,如MATCHED THEN UPDATE SET UserId=@MauroRocco我编辑了问题,并放入了xml。@MauroRocco我尝试过不使用方括号,但验证仍在继续。我们如何处理日期类型参数?如果参数不为null,则应添加单引号;如果参数为null,则不应添加引号。如果参数为null,则需要像字符串串联一样进行处理。有些人在使用flowVar之前就准备好了查询,以便在groovy或表达式组件中执行复杂的查询,而不是像#[flowVar.query]这样的内容。但是,如果您发现自己经常这样做,那么您可能正在使用ESB来做不该做的事情,并记住注入风险。