I have the following on a SQL Server 2014 database:
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
I'm attempting to create the below Stored Proc:
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
However, I receive the error:
 A MERGE statement must be terminated by a semi-colon (;).
What am I missing? The semi-colon is clearly there so there must be something else up.
Strictly speaking all SQL statements should be terminated with a semicolon. i.e.
SELECT
    Example
FROM
    Test1
;
SELECT
    Example
FROM
    Test2
;
In practice SQL Server only enforces this for certain query types, for now. Statements that precede CTEs and MERGEs are an example of this.
From 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.
Of course it doesn't help that the error message tells you to terminate the merge but doesn't mention the preceding query is also required. Try:
BEGIN TRANSACTION agcUpsertTran;
    MERGE AssetGroupClassification AS t
    ....
    ;
I ran the same script in Server Explorer within Visual Studio 2013 and the stored proc was created without any problems. I assume the issue is to do with the IDE I'm using, Aqua Data Studio 15.0.11.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With