2016-05-31 17 views
2

ich versuchen, diese Transaktion auszuführen:merge in Sqlserver - falsche Syntax

GO 
BEGIN TRAN; 
MERGE A AS t 
USING B AS tmp 
ON (t.domain = tmp.domain and t.link=tmp.link) 
WHEN NOT MATCHED BY A 
    THEN INSERT(ipVal, domain, dateStart, dateUpdate, dateFinish, link) VALUES(tmp.ipVal, tmp.domain, tmp.dateStart, tmp.dateUpdate, tmp.dateFinish, tmp.link) 
WHEN MATCHED 
    THEN UPDATE SET t.dateupdate = tmp.dateupdate 
WHEN NOT MATCHED BY B 
    THEN UPDATE SET t.datefinish="a" 
ROLLBACK TRAN; 
GO 

ich diesen Code aus here nahm, aber als ich versuchte, dies auszuführen, habe ich einen Fehler:

Incorrect syntax near 'A' 

Was Kann das Problem sein?

+0

Ein verständlicher Fehler, da die Technet-Seite zu Anwendungen verknüpft 'target' und' Source' als Name für die Beispieltabellen, damit sie mit den 'target' und' SOURCE' Schlüsselwort zu mischen. – Heinzi

Antwort

6

Nach MSDN die vereinfachte Syntax für WHEN NOT MATCHED Verzweigungen

[ WHEN NOT MATCHED [ BY TARGET ] [...] 
     THEN <merge_not_matched> ] 
    [ WHEN NOT MATCHED BY SOURCE [...] 
     THEN <merge_matched> ] [ ...n ] 

Die Lösung WHEN NOT MATCHED BY A mit WHEN NOT MATCHED BY TARGET und WHEN NOT MATCHED BY B mit WHEN NOT MATCHED BY SOURCE zu ersetzen ist.

TARGET und SOURCE sind T-SQL-Schlüsselwörter nicht Platzhalter.

0

One Ich begann gerade MERGE ich diese Syntax, es zu verstehen rechten Seite zu verwenden:

MERGE A AS target 
USING B AS source 
ON (target.domain = source.domain and target.link=source.link) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(ipVal, domain, dateStart, dateUpdate, dateFinish, link) 
    VALUES(source.ipVal, source.domain, source.dateStart, source.dateUpdate, source.dateFinish, source.link) 
WHEN MATCHED 
    THEN UPDATE SET target.dateupdate = source.dateupdate 
WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET target.datefinish="a" 

Ich weiß, es ist eine schlechte Praxis aber beim Start - hilft viel.

Wie @BogdanSahlean Punkte TARGET und SOURCE sind Schlüsselwörter und es sind erforderlich, wenn Sie übereinstimmende/nicht übereinstimmende Aussagen bestimmen.

0

Es sieht so aus, als ob Sie versuchen, die Datums- oder Datetime-Spalte mit char- oder varchar-Daten zu aktualisieren, die nicht nach Datum oder Datetime konvertiert werden können. 'a' ist nicht auf Datum oder Datum umsetzbar. Sehen Sie sich die erste und die zweite Zusammenführung an, die ich unten aufgeführt habe. Wenn Sie nicht angeben, ob eine Übereinstimmung oder Quelle oder Ziel nicht übereinstimmen, wird standardmäßig Ziel berücksichtigt.

--DROP TABLE #A; 
--DROP TABLE #B; 

CREATE TABLE #A 
    (
     ipval VARCHAR(50) 
    , domain CHAR(5) 
    , dateStart DATE 
    , dateUpdate DATE 
    , dateFinish DATE 
    , link VARCHAR(50) 
    ); 

CREATE TABLE #B 
    (
     ipval VARCHAR(50) 
    , domain CHAR(5) 
    , dateStart DATE 
    , dateUpdate DATE 
    , dateFinish DATE 
    , link VARCHAR(50) 
    ); 
INSERT INTO #B 
     (ipval, domain, dateStart, dateUpdate, dateFinish, link) 
VALUES ('42.130.239.56' -- ipval - varchar(50) 
      , '.com' -- domain - char(5) 
      , GETDATE() -- dateStart - date 
      , DATEADD(DAY, 1, GETDATE()) -- dateUpdate - date 
      , DATEADD(DAY, 5, GETDATE()) -- dateFinish - date 
      , 'www.stackoverflow' -- link - varchar(50) 
      ), 
     ('78.188.136.74' -- ipval - varchar(50) 
      , '.com' -- domain - char(5) 
      , GETDATE() -- dateStart - date 
      , DATEADD(DAY, 2, GETDATE()) -- dateUpdate - date 
      , DATEADD(DAY, 10, GETDATE()) -- dateFinish - date 
      , 'www.msdn' -- link - varchar(50) 
      ); 

INSERT INTO #A 
     (ipval, domain, dateStart, dateUpdate, dateFinish, link) 
VALUES ('30.48.111.20' -- ipval - varchar(50) 
      , '.com' -- domain - char(5) 
      , GETDATE() -- dateStart - date 
      , DATEADD(DAY, 5, GETDATE()) -- dateUpdate - date 
      , DATEADD(DAY, 10, GETDATE()) -- dateFinish - date 
      , 'www.msdn' -- link - varchar(50) 
      ), 
     ('30.48.111.20' -- ipval - varchar(50) 
      , '.com' -- domain - char(5) 
      , GETDATE() -- dateStart - date 
      , DATEADD(DAY, 5, GETDATE()) -- dateUpdate - date 
      , DATEADD(DAY, 10, GETDATE()) -- dateFinish - date 
      , 'www.gmail' -- link - varchar(50) 
      ); 
--First Merge 
BEGIN TRAN; 
MERGE #A AS T 
USING #B AS tmp 
ON T.domain = tmp.domain 
    AND T.link = tmp.link 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ipval 
      , domain 
      , dateStart 
      , dateUpdate 
      , dateFinish 
      , link 
      ) 
    VALUES (tmp.ipval 
      , tmp.domain 
      , tmp.dateStart 
      , tmp.dateUpdate 
      , tmp.dateFinish 
      , tmp.link 
      ) 
WHEN MATCHED THEN 
    UPDATE SET T.dateUpdate = tmp.dateUpdate 
WHEN NOT MATCHED BY SOURCE THEN 
    UPDATE SET T.dateFinish =''a''; 
COMMIT TRAN; 
GO 


SELECT * 
FROM #A; 
SELECT * 
FROM #B; 
--Second Merge 
BEGIN TRAN; 
MERGE #A AS T 
USING #B AS tmp 
ON T.domain = tmp.domain 
    AND T.link = tmp.link 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ipval 
      , domain 
      , dateStart 
      , dateUpdate 
      , dateFinish 
      , link 
      ) 
    VALUES (tmp.ipval 
      , tmp.domain 
      , tmp.dateStart 
      , tmp.dateUpdate 
      , tmp.dateFinish 
      , tmp.link 
      ) 
WHEN MATCHED THEN 
    UPDATE SET T.dateUpdate = tmp.dateUpdate 
WHEN NOT MATCHED BY SOURCE THEN 
    UPDATE SET T.dateFinish = CAST(GETDATE() AS DATE); 
COMMIT TRAN; 
GO 


SELECT * 
FROM #A; 
SELECT * 
FROM #B;