Может кто-нибудь объяснить, почему Sql Server жалуется на синтаксис вокруг предложения «WITH»?
Спасибо за любую помощь.
CREATE TABLE TestTable1 (
Id int not null,
Version int not null constraint d_Ver default (0),
[Name] nvarchar(50) not null,
CONSTRAINT pk_TestTable1 PRIMARY KEY (Id, Version)
);
GO
CREATE TRIGGER trg_iu_UniqueActiveName
ON [dbo].[TestTable1]
AFTER INSERT, UPDATE
AS
IF(UPDATE([Name]))
BEGIN
IF(
(
WITH MaxVers AS
(SELECT Id, Max(Version) AS MaxVersion
FROM [dbo].[TestTable1]
GROUP BY Id)
SELECT Count(1)
FROM [dbo].[TestTable1] t
INNER JOIN MaxVers ON t.Id = MaxVers.Id AND t.Version = MaxVers.MaxVersion
WHERE t.[Name] = inserted.[Name]
)
> 0
)
BEGIN
DECLARE @name nvarchar(50)
SELECT @name = [Name] FROM inserted;
RAISERROR('The name "%s" is already in use.', 16, 1, @name);
END
END;
GO
Редактировать 2: Любому, кто интересуется,Вот версия CTE, которая включает в себя все замечательные комментарии ниже.Я думаю, что я переключусь на подход подзапроса, чтобы я мог использовать «EXISTS» как предложено.
CREATE TRIGGER trg_iu_UniqueActiveName
ON [dbo].[TestTable1]
AFTER INSERT, UPDATE
AS
IF(UPDATE([Name]))
BEGIN
DECLARE @cnt [int];
WITH MaxVers AS
(SELECT Id, Max(Version) AS MaxVersion
FROM [dbo].[TestTable1]
GROUP BY Id)
SELECT @cnt = COUNT(1)
FROM [dbo].[TestTable1] t
INNER JOIN MaxVers ON t.Id = MaxVers.Id AND t.Version = MaxVers.MaxVersion
INNER JOIN [inserted] i ON t.[Id] = MaxVers.[Id]
WHERE t.[Name] = i.[Name] AND NOT [t].[Id] = [i].[Id] ;
IF( @cnt > 0)
BEGIN
DECLARE @name nvarchar(50)
SELECT @name = [Name] FROM inserted;
RAISERROR('The name "%s" is already in use by an active entity.', 16, 1, @name);
ROLLBACK TRANSACTION;
END
END;
GO
Редактировать 3: Вот версия «Exists» (Примечание, я думаю, что выборв части обработки ошибок не будет работать правильно с более чем одной вставленной записью):
CREATE TRIGGER trg_iu_UniqueActiveName
ON [dbo].[TestTable1]
AFTER INSERT, UPDATE
AS
IF(UPDATE([Name]))
BEGIN
IF(EXISTS (
SELECT t.Id
FROM [dbo].[TestTable1] t
INNER JOIN (
SELECT Id, Max(Version) AS MaxVersion
FROM [dbo].[TestTable1]
GROUP BY Id) maxVer
ON t.[Id] = [maxVer].[Id] AND [t].[Version] = [maxVer].[MaxVersion]
INNER JOIN [inserted] i ON t.[Id] = MaxVer.[Id]
WHERE [t].[Name] = [i].[Name] AND NOT [t].[Id] = [i].[Id]
))
BEGIN
DECLARE @name nvarchar(50)
SELECT @name = [Name] FROM inserted;
RAISERROR('The name "%s" is already in use by an active entity.', 16, 1, @name);
ROLLBACK TRANSACTION;
END
END;
GO