我正在尝试通过执行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';
答案 0 :(得分:1)
我认为T-SQL是正确的。 您是否尝试将分号作为T-SQL的第一个字符? 我有与CTE类似的问题并且放'';'在'WITH'帮助之前。
答案 1 :(得分:0)
首先,您确定您能够在SSMS中运行语句的同一服务器具有正确的连接吗?当然,如果要连接的服务器设置为兼容模式,则会出错。检查exec SQl任务的所有设置,可能不是查询,而是设置任务的方式。你可以运行一个select来执行当前设置的exec sql中的相同表吗?
我从未尝试在Exec SQl中运行合并(我们处于兼容模式,因此我无法使用新语法),但你试过这个吗?
将sql转换为存储过程。确保您可以在连接所在的同一服务器上执行proc。
然后在exec SQl任务中执行proc。那样有用吗?