Sql server SQL Server错误:合并语句必须以分号(;)终止

Sql server SQL Server错误:合并语句必须以分号(;)终止,sql-server,merge,Sql Server,Merge,我在SQL Server 2014数据库上有以下内容: CREATE TABLE dbo.AssetGroupClassification ( ClassificationId int IDENTITY(1,1) NOT NULL, ClassificationName varchar(25) NOT NULL, CONSTRAINT [PK_AssetGroupClassification.ClassificationId] PRIMARY KEY CLUS

我在SQL Server 2014数据库上有以下内容:

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 (;).

我错过了什么?分号很明显在那里,所以肯定有其他的东西。

请从

我想,你失踪了

WHEN NOT MATCHED BY TARGET THEN

严格来说,所有SQL语句都应该以分号结尾。i、 e

SELECT
    Example
FROM
    Test1
;

SELECT
    Example
FROM
    Test2
;
实际上,SQLServer目前仅对某些查询类型强制执行此操作。CTE和MERGEs之前的语句就是一个例子

发件人:

);Transact-SQL语句终止符。尽管分号不是 此版本的SQL Server中的大多数语句都需要它 在未来版本中需要

当然,错误消息告诉您终止合并,但没有提到前面的查询也是必需的,这并没有帮助。尝试:

BEGIN TRANSACTION agcUpsertTran;

    MERGE AssetGroupClassification AS t
    ....
    ;

我在VisualStudio2013的服务器资源管理器中运行了相同的脚本,并且创建存储过程时没有出现任何问题。我假设问题与我使用的IDE有关,Aqua Data Studio 15.0.11。

只是一个侧节点。如果将
visualstudio code
与MSSQL插件
sqlserver(MSSQL)
一起使用,您将遇到相同的问题。尽管语法正确,但在执行时它会抱怨缺少分号

在脚本文件中的visual studio编辑器下执行脚本时,需要在脚本末尾添加
添加分号VS后,将成功生成脚本。

命令已成功完成。
我可以毫无问题地运行脚本。你是把它作为一个更大的脚本的一部分来运行吗?@Devart,谢谢,这很好interesting@GarethD不,脚本中唯一的其他位是之前的检查(如果存在,则删除该进程),然后为其添加权限。仅供参考,兼容性级别设置为120。您是否在
TRY
内启动事务,但在
CATCH
子句中尝试回滚?为什么不从外面开始呢?顺便说一句,你是怎么得到这个错误的?您是在执行创建过程时还是在调用存储过程时得到它的?
BY TARGET
是可选的,这在博客文章中提到过。无论如何,应该对照脚本检查语法是否正确。BEGIN TRAN不需要分号。这一点很好。有无测试。这没什么区别。这里也一样:在DBeaver上,我遇到了错误,去了ManagementStudio工作。我在SQLServerManageStudioV17.7中遇到了这个问题。隐马尔可夫模型
BEGIN TRANSACTION agcUpsertTran;

    MERGE AssetGroupClassification AS t
    ....
    ;