2016-03-11 197 views
3

一個SQL Server上,我有以下2014數據庫:SQL Server錯誤:(;)MERGE語句必須用分號來終止

CREATE TABLE dbo.AssetGroupClassification ( 
    ClassificationId int IDENTITY(1,1) NOT NULL, 
    ClassificationName varchar(25) NOT NULL, 
    CONSTRAINT [PK_AssetGroupClassification.ClassificationId] PRIMARY KEY CLUSTERED(ClassificationId) 
) 
GO 
CREATE TYPE dbo.AssetGroupClassUDT AS TABLE (
    ClassificationId int IDENTITY (1, 1) NOT NULL, 
    ClassificationName varchar(25) NOT NULL 
    ) 
GO 

我試圖創建下面的存儲過程:

CREATE PROCEDURE dbo.AssetGroupClassUpsert 
     @assetGrpClassData AssetGroupClassUDT READONLY 
AS 
BEGIN 
    SET XACT_ABORT, NOCOUNT ON 

    BEGIN TRY 
     BEGIN TRANSACTION agcUpsertTran 

     MERGE AssetGroupClassification AS t 
     USING @assetGrpClassData AS src 
     ON t.ClassificationId = src.ClassificationId 
     WHEN MATCHED THEN 
      UPDATE SET ClassificationName = src.ClassificationName 
     WHEN NOT MATCHED THEN 
      INSERT (ClassificationName) 
      VALUES (src.ClassificationName); 

     COMMIT TRANSACTION agcUpsertTran 
    END TRY 
    BEGIN CATCH 
     IF @@trancount > 0 ROLLBACK TRANSACTION 
     DECLARE @errMsg nvarchar(4000) = ERROR_MESSAGE() 
     RAISERROR (@errMsg, 16, 1) 

     RETURN 99 
    END CATCH 
END 
GO 

不過,我收到錯誤:

A MERGE statement must be terminated by a semi-colon (;). 

我缺少什麼?分號顯然存在,所以必須有別的東西。

+1

命令已成功完成。 – Devart

+2

我可以毫無問題地運行腳本。你是否將它作爲更大腳本的一部分運行? – GarethD

+0

@ Devart,謝謝,這很有趣 – markblandford

回答

1

我在Visual Studio 2013中的服務器資源管理器中運行了相同的腳本,並且創建了存儲的proc時沒有任何問題。我認爲這個問題與我正在使用的IDE Aqua Data Studio 15.0.11有關。

+0

同樣在這裏:在DBeaver我得到錯誤,去管理工作室和工作。 –

0

請看看下面的語法從Simple-talk

MERGE BookInventory bi 

USING BookOrder bo 

ON bi.TitleID = bo.TitleID 

WHEN MATCHED AND 

    bi.Quantity + bo.Quantity = 0 THEN 

    DELETE 

WHEN MATCHED THEN 

    UPDATE 

    SET bi.Quantity = bi.Quantity + bo.Quantity 

WHEN NOT MATCHED BY TARGET THEN 

    INSERT (TitleID, Title, Quantity) 

    VALUES (bo.TitleID, bo.Title,bo.Quantity) 

WHEN NOT MATCHED BY SOURCE 

    AND bi.Quantity = 0 THEN 

    DELETE; 

我想,你缺少,

WHEN NOT MATCHED BY TARGET THEN 
+2

'BY TARGET'是可選的,*是博客文章中提到的*。無論如何,應根據[文檔]檢查語法(https://msdn.microsoft.com/en-us/library/bb510625.aspx) –

1

嚴格地說所有SQL語句應該用分號結束。即

SELECT 
    Example 
FROM 
    Test1 
; 

SELECT 
    Example 
FROM 
    Test2 
; 

在實際中,SQL Server僅對某些查詢類型強制執行此操作。 CTE和MERGE之前的聲明就是一個例子。

MSDN

; Transact-SQL statement terminator.Although the semicolon is not required for most statements in this version of SQL Server, it will be required in a future version.

當然,這不利於該錯誤消息告訴您終止合併,但沒有提到還需要前面的查詢。嘗試:

BEGIN TRANSACTION agcUpsertTran; 

    MERGE AssetGroupClassification AS t 
    .... 
    ; 
+3

該腳本正常。 BEGIN TRAN不需要分號。 –

+1

好點。測試有和沒有。它沒有任何區別。 –