我为插入
后创建了一个触发器ALTER TRIGGER [dbo].[UpdateClientNumber]
ON [dbo].[APP_Clients]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Count bigint
DECLARE @ClientNumber nchar(15)
SELECT @Count = COUNT(*) FROM [dbo].[APP_Clients]
IF @Count = 0
BEGIN
SET @ClientNumber = CONVERT(nchar(4), YEAR(GETDATE())) + '01' + '0001'
UPDATE [dbo].[APP_Clients]
SET [ClientNumber] = @ClientNumber
FROM inserted i
LEFT JOIN [dbo].[APP_Clients] j ON i.ID = j.ID
END
ELSE
BEGIN
SELECT @ClientNumber = MAX(SUBSTRING([ClientNumber], 7, len([ClientNumber]) - 0))
FROM [dbo].[APP_Clients]
WHERE (SUBSTRING([ClientNumber], 1, len([ClientNumber]) - 6) = YEAR(GETDATE()))
SET @ClientNumber = CONVERT(bigint, @ClientNumber) + 1
SET @ClientNumber = CONVERT(nchar(4), YEAR(GETDATE())) + '01' + @ClientNumber
UPDATE [dbo].[APP_Clients]
SET [ClientNumber] = @ClientNumber
FROM inserted i
LEFT JOIN [dbo].[APP_Clients] j ON i.ID = j.ID
END
END
表[dbo]。[APP_Clients]列
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[ClientName] [nvarchar](100) NULL,
[ClientNumber] [nchar](15) NULL,
[ClientGSM1] [nvarchar](50) NULL,
[ClientGSM2] [nvarchar](50) NULL,
[ClientEmail] [nchar](50) NULL,
[ClientOccupation] [nvarchar](50) NULL,
[ClientWorkPlace] [nvarchar](100) NULL
插入ClientNumber后没有更新。
关心, 穆罕默德
答案 0 :(得分:0)
它取决于当前在数据库上设置的触发器的递归级别。
如果你这样做:
SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
或者这个:
ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF
上面的那个触发器不会被再次调用,你会安全的(除非你遇到某种僵局;这可能是可能的,但也许我错了)。
不过,我不认为这是一个好主意。更好的选择是使用INSTEAD OF trigger。这样您就可以避免通过DB执行第一次(手动)更新。只会执行触发器内定义的那个。
答案 1 :(得分:0)
SQL Server(和Oracle)不喜欢您对该表的触发器中的变异表进行更改。您需要以不同的方式处理它,或拦截插入。
由于您尝试更改插入的数据,因此可以使用Instead of
而不是after
插入触发器:
这是一个非常简单的表示方式:
Create Trigger trg_App_Clients_Insert
On App_Clients
Instead of Insert
As
Begin
Declare @no int;
Select @no = IsNull(Max(ClientNumber), 0) + 1
From App_Clients
Insert into App_Clients (Name, ClientNumber)
Select Name, @no
From inserted
End
Go