2012-08-02 42 views
2

我試圖在兩個臨時表中使用「MERGE」,但未能獲得結果。SQL Server 2008中的合併語句錯誤(語法附近不正確)

錯誤:關鍵字'AS'附近的語法不正確。

Create Table #tmp1 
    (
    [Server] varchar(4), 
    [DateTime] datetime, 
    IdComponent int, 
    AvgTimeTaken int 
    ) 

    Create Table #tmp2 
    (
    [Server] varchar(4), 
    [DateTime] datetime, 
    IdComponent int, 
    AvgTimeTaken int 
    ) 

    insert into #tmp1 values ('BE01','2012-08-01 00:00:00',1,100) 
    insert into #tmp1 values ('BE02','2012-08-01 00:00:00',2,100) 
    insert into #tmp1 values ('BE03','2012-08-01 00:00:00',3,100) 
    insert into #tmp1 values ('BE04','2012-08-01 00:00:00',4,100) 
    insert into #tmp1 values ('BE05','2012-08-01 00:00:00',5,100) 


    insert into #tmp2 values ('BE01','2012-08-01 00:00:00',1,100) 
    insert into #tmp2 values ('BE02','2012-08-01 00:00:00',2,200) 
    insert into #tmp2 values ('BE03','2012-08-01 00:00:00',3,300) 
    insert into #tmp2 values ('BE04','2012-08-01 01:00:00',4,400) 
    insert into #tmp2 values ('BE05','2012-08-01 02:00:00',5,500) 

    MERGE #tmp1 AS [Target] 
    USING #tmp2 AS [Source] 
    ON ([Target].[Server] = [Source].[Server] 
     AND [Target].[DateTime] = [Source].[DateTime] 
     AND [Target].[IdComponent] = [Source].[IdComponent]) 
    WHEN MATCHED THEN 
     UPDATE 
     SET [Target].AvgTimeTaken = [Source].AvgTimeTaken 
    WHEN NOT MATCHED THEN 
     INSERT ([Target].[Server], [Target].[DateTime], [Target].IdComponent, [Target].AvgTimeTaken) 
VALUES ([Source].[Server], [Source].[DateTime], [Source].IdComponent, [Source].AvgTimeTaken); 

我不知道我可能是錯的。最後還有一個分號。 請幫忙!

+2

還在* MERGE上的語句*中放置了分號。你應該養成在T-SQL中總是正確地終止語句的習慣 - 這些需求隨着每個新版本的增加而增加,並且隨處可見。 – 2012-08-03 02:56:29

回答

2

取出INSERT子句中的Target別名。

Create Table #tmp1 (
    [Server] varchar(4), 
    [DateTime] datetime, 
    IdComponent int, 
    AvgTimeTaken int 
); 

Create Table #tmp2 (
    [Server] varchar(4), 
    [DateTime] datetime, 
    IdComponent int, 
    AvgTimeTaken int 
); 

insert into #tmp1 values ('BE01','2012-08-01 00:00:00',1,100); 
insert into #tmp1 values ('BE02','2012-08-01 00:00:00',2,100); 
insert into #tmp1 values ('BE03','2012-08-01 00:00:00',3,100); 
insert into #tmp1 values ('BE04','2012-08-01 00:00:00',4,100); 
insert into #tmp1 values ('BE05','2012-08-01 00:00:00',5,100); 


insert into #tmp2 values ('BE01','2012-08-01 00:00:00',1,100); 
insert into #tmp2 values ('BE02','2012-08-01 00:00:00',2,200); 
insert into #tmp2 values ('BE03','2012-08-01 00:00:00',3,300); 
insert into #tmp2 values ('BE04','2012-08-01 01:00:00',4,400); 
insert into #tmp2 values ('BE05','2012-08-01 02:00:00',5,500); 

MERGE #tmp1 AS Target 
USING #tmp2 AS Source 
ON (Target.Server = Source.Server 
    AND Target.DateTime = Source.DateTime 
    AND Target.IdComponent = Source.IdComponent) 
WHEN MATCHED THEN 
    UPDATE 
    SET Target.AvgTimeTaken = Source.AvgTimeTaken 
WHEN NOT MATCHED THEN 
    INSERT (Server, DateTime, IdComponent, AvgTimeTaken) 
VALUES (Source.Server, Source.DateTime, Source.IdComponent, Source.AvgTimeTaken); 
5

我碰到以前這個錯誤,這是因爲SQL Server 2008中,除非你通過執行以下設置兼容模式R2不支持合併語法:

ALTER DATABASEMyDatabase的SET COMPATIBILITY_LEVEL = 100

MyDatabase的是要將此應用到數據庫的名稱。

0

MERGE語句中使用的插入列表不能包含多部分標識符。改用單個零件標識符。

相關問題