April 15, 2009 at 9:07 am
Could someone try this to see what happens
I am using SS2K8 - Compatibilty Level 9.0 and am getting the following error when I run the following code:
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'MERGE'.
USE tempdb;
GO
DROP TABLE Target
DROP TABLE Source
GO
CREATE TABLE dbo.Target(EmployeeID int, EmployeeName varchar(10),
CONSTRAINT Target_PK PRIMARY KEY(EmployeeID));
CREATE TABLE dbo.Source(EmployeeID int, EmployeeName varchar(10),
CONSTRAINT Source_PK PRIMARY KEY(EmployeeID));
GO
INSERT dbo.Target(EmployeeID, EmployeeName) VALUES(100, 'Mary');
INSERT dbo.Target(EmployeeID, EmployeeName) VALUES(101, 'Sara');
INSERT dbo.Target(EmployeeID, EmployeeName) VALUES(102, 'Stefano');
GO
INSERT dbo.Source(EmployeeID, EmployeeName) Values(103, 'Bob');
INSERT dbo.Source(EmployeeID, EmployeeName) Values(104, 'Steve');
GO
USE tempdb;
GO
BEGIN TRAN;
MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID)
WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%'
THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED
THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
THEN DELETE
OUTPUT $action, inserted.*, deleted.*;
ROLLBACK TRAN;
GO
April 15, 2009 at 9:24 am
You need to change compatibility level to 100 to use MERGE because it was implemented in 2008. Check below for details.
http://msdn.microsoft.com/en-us/library/bb510625.aspx
Kind regards,
Gift Peddie
September 26, 2011 at 5:13 am
Hi,
I have the same issue - which after taking snipets from online samples and playing them through have been failing - so I have been working through the basics and now know the answer, thank you.
Just the one question - I have read the MSDN article and just wanted to check what the potential damage could be to an ERP system that is acessing the Database.
I need to create a procedure that appends records to a table only with the MERGE WHEN NOT MATCHED to TARGET options. Obviously using the compatibility level will allow me to do this - BUT - I do not want to break anything at the same time.
Is there an alternative "2005" way of doing a merge statement without the merge statement ?
Basically I want to update a "Snapshot" table at point of Despatch and that only appends records that have not already been added. I suppose an INSERT into which Record = NULL ? loop ?
Thanks in advance
________________________________________________________________________________________________
Regards
Steve
SQL 2008 DBA/DBD - MCTS/MCITP
Please don't trust me, test the solutions I give you before using them.
September 26, 2011 at 5:30 am
Insert into Destination
from Source where not exists (select from destination where <comparison condition>)
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
September 19, 2014 at 9:58 am
Hi,
Had a similar query on merge, merge when used on large data takes a very long time to execute. I have data count of over 14 million records, where i am comparing 5 columns data with target table if there is any difference then my merge statement creates a new record if data is matched then merge updates old record.
Is there any other optimized way to perform this operation besides merge statement. ?
Any help would be appreciated.
Thanks,
-Jack
December 5, 2018 at 11:23 pm
HI,
My question is regarding MERGE from SQL server.
I am working in SQL 2008.
I am trying to get the data from One table to 2 temp table with different conditions.
Then update Quantity using merge
but it is giving some syntax error.
Please find my code snippet.
-- Inappropriate syntax near the keyword 'INTO'.Select * INTO #DT0604_MAX_TARGET from DT0604
where WID = @strWID
AND NO = (SELECT MAX(NO) FROM DT0604 where WID = @strWID AND NO <> -1) /*All data less than MAX number in Source table.*/
Select WID,ACD_FL,DATA_NO,SEQ_NO,GCT_COMP_NO,SUM(QTY) AS QTY INTO #DT0604_MAX_SOURCE from DT0604
where WID = @strWID
--AND NO = @str2ndMax_AkajiNo
/*#DT0604_MAX_TARGET Has max Akaji data.
Consider all Akaji data in source table except max Akaji data.*/
AND NOT EXISTS
(
SELECT 'X' from #DT0604_MAX_TARGET
where #DT0604_MAX_TARGET.WID = DT0604.WID
AND #DT0604_MAX_TARGET.NO = DT0604.NO
)
GROUP BY WID,ACD_FL,DATA_NO,SEQ_NO,GCT_COMP_NO
MERGE INTO #DT0604_MAX_TARGET AS TARGET /* Syntax error here according to SQL*/
USING #DT0604_MAX_SOURCE AS SOURCE
ON
(
Target.WID = Source.WID AND
Target.ACD_FL = Source.ACD_FL AND
Target.DATA_NO = Source.DATA_NO AND
Target.SEQ_NO = Source.SEQ_NO AND
Target.GCT_COMP_NO = Source.GCT_COMP_NO
)
WHEN MATCHED THEN
UPDATE SET TARGET.QTY += SOURCE.QTY
OUTPUT $action,
DELETED.WID AS Target_WID,
DELETED.NO AS Target_NO,
DELETED.ACD_FL AS Target_ACD_FL,
DELETED.GCT_COMP_NO AS Target_GCT_COMP_NO,
INSERTED.WID AS Source_WID,
INSERTED.NO AS Source_NO,
INSERTED.ACD_FL AS Source_ACD_FL,
INSERTED.GCT_COMP_NO AS Source_GCT_COMP_NO;
Select * from #DT0604_MAX_TARGET
I am not sure where the syntax is going wrong.
To my surprise if I execute the code in separate parts then it is executed successfully.
Thank you in advance
Viewing 6 posts - 1 through 5 (of 5 total)
You must be logged in to reply to this topic. Login to reply