Sql server SQL Server错误:合并语句必须以分号(;)终止
我在SQL Server 2014数据库上有以下内容: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
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
....
;