SSIS执行SQL任务是否处理MERGE语句?

时间:2010-01-13 22:56:29

标签: sql-server-2008 syntax ssis merge

我正在尝试通过执行SQL任务执行MERGE语句,如本文所述:

http://technet.microsoft.com/en-us/library/cc280522.aspx

我的MERGE声明非常简单(见下文)。我可以在SSMS中毫无困难地执行MERGE语句,但是当我将它放入执行SQL任务时,它会因为以下错误而失败:“关键字'AS'附近的语法不正确。”。可能的失败原因:查询问题,“ResultSet”属性设置不正确,参数设置不正确或连接未正确建立。

该语句不会在Execute SQL Task容器中解析,但显然在SSMS中(因为它正确运行)。在执行SQL任务中使用MERGE语句时,是否需要了解任何技巧或语法注意事项?

MERGE HospitalDailyWastage AS TGT
USING NightlyHospitalWastage AS SRC
ON (
        TGT.HospitalID = SRC.HospitalID AND
        TGT.WastageDate = SRC.WastageDate AND
        TGT.ProductGroupID = SRC.ProductGroupID AND
        TGT.DataTypeID = SRC.DataTypeID AND
        TGT.ServiceLineID = SRC.ServiceLineID
    )
WHEN NOT MATCHED BY TARGET
    THEN INSERT (   
            HospitalID,
            WastageDate,
            ProductGroupID,
            DataTypeID,
            ServiceLineID,
            OPos,
            ONeg,
            APos,
            ANeg,
            BPos,
            BNeg,
            ABPos,
            ABNeg,
            Auto,
            LastUpdated,
            UpdatedBy
        ) VALUES (
            SRC.HospitalID,
            SRC.WastageDate,
            SRC.ProductGroupID,
            SRC.DataTypeID,
            SRC.ServiceLineID,
            SRC.OPos,
            SRC.ONeg,
            SRC.APos,
            SRC.ANeg,
            SRC.BPos,
            SRC.BNeg,
            SRC.ABPos,
            SRC.ABNeg,
            SRC.Auto,
            getdate(),
            'system'            
        )   
WHEN MATCHED 
    THEN UPDATE SET TGT.OPos = SRC.OPos,
                    TGT.ONeg = SRC.ONeg,
                    TGT.APos = SRC.APos,
                    TGT.ANeg = SRC.ANeg,
                    TGT.BPos = SRC.BPos,
                    TGT.BNeg = SRC.BNeg,
                    TGT.ABPos = SRC.ABPos,
                    TGT.ABNeg = SRC.ABNeg,
                    TGT.Auto = SRC.Auto,
                    TGT.LastUpdated = getdate(),
                    TGT.UpdatedBy = 'system';

2 个答案:

答案 0 :(得分:1)

我认为T-SQL是正确的。 您是否尝试将分号作为T-SQL的第一个字符? 我有与CTE类似的问题并且放'';'在'WITH'帮助之前。

答案 1 :(得分:0)

首先,您确定您能够在SSMS中运行语句的同一服务器具有正确的连接吗?当然,如果要连接的服务器设置为兼容模式,则会出错。检查exec SQl任务的所有设置,可能不是查询,而是设置任务的方式。你可以运行一个select来执行当前设置的exec sql中的相同表吗?

我从未尝试在Exec SQl中运行合并(我们处于兼容模式,因此我无法使用新语法),但你试过这个吗?

将sql转换为存储过程。确保您可以在连接所在的同一服务器上执行proc。

然后在exec SQl任务中执行proc。那样有用吗?