【发布时间】:2017-01-18 02:46:19
【问题描述】:
我想在插入新记录后创建一个触发器,它应该捕获新记录信息。
CREATE TRIGGER trg_AccountInsert
ON [dbo].[Accounts]
FOR INSERT
AS
BEGIN
DECLARE @NewValue NVARCHAR(4000);
DECLARE @Name NVARCHAR(256);
DECLARE @CompanyName NVARCHAR(256);
DECLARE @ContactPhone NVARCHAR(256);
DECLARE @Status bit;
DECLARE @OtherId int;
SELECT @OtherId = i.AccountId FROM inserted i;
SELECT @name = i.Name FROM inserted i;
SELECT @CompanyName = i.CompanyName FROM inserted i;
SELECT @ContactPhone = i.ContactPhone FROM inserted i;
SELECT @Status = i.[Status] FROM inserted i;
SET @NewValue = N'[{
"Name" : ' + @Name +',
"CompanyDetails" : '+ @CompanyName +',
"ContactPhone" : '+ @ContactPhone + ',
"Status" : '+ @Status + '
}]';
PRINT @NewValue
INSERT INTO Auditlog (OtherId, TableName, ActionDate, ActionBy, Operation, ActionType)
VALUES (@OtherId, 'Accounts', getdate(), '', 'Insert', 'Accounts');
DECLARE @AuditlogId int;
SET @AuditlogId = IDENT_CURRENT('dbo.Auditlog') ;
INSERT INTO AuditlogDetails (AuditlogId, OldValue, NewValue)
VALUES (@AuditlogId, null, @NewValue);
END
但我得到一个错误:
消息 402,级别 16,状态 1,过程 trg_AccountInsert,第 79 行
数据类型 nvarchar 和 bit 在 add 运算符中不兼容。
请帮我解决这个错误
【问题讨论】:
-
错误信息清楚地说明了发生了什么。状态位,需要在“set @NewValue = ....”语句中将其转换为nvarchar
-
我可以使用这个 CAST(@Status as NVARCHAR(10))
-
不必转换为 nvarchar(10),nvarchar 足够长。
-
不要这样做。你的触发器从根本上是有缺陷的。一次插入多行很容易,然后您的触发器不会按照您的想法执行。
-
sr 但是你能帮我我插入的@NewValue 是空的
标签: sql sql-server triggers insert