【问题标题】:I have a error with create trigger in SQL Server我在 SQL Server 中创建触发器时出错
【发布时间】: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


【解决方案1】:

希望这会对您有所帮助.. 简化且一次可用于多个插入。

注意:架构我仅从您的代码中假设,没有经过测试,因为我没有架构和数据。

CREATE TRIGGER trg_AccountInsert
ON [dbo].[Accounts]
FOR INSERT
AS
BEGIN
    INSERT INTO Auditlog (OtherId, TableName, ActionDate, ActionBy, Operation, ActionType)
        SELECT 
            i.AccountId, 'Accounts', getdate(), '', 'Insert', 'Accounts' 
        FROM 
            inserted i

    /*  --As per comments updated new insert below
    INSERT INTO AuditlogDetails (AuditlogId, OldValue, NewValue)
        SELECT 
            A.AuditlogId, NULL, N'[{
                "Name" : ' + ISNULL(i.NAME,'') +',
                "CompanyDetails" : '+ ISNULL(I.CompanyName,'') +',
                "ContactPhone" : '+ ISNULL(I.ContactPhone,'') + ',
                "Status" : '+ISNULL( CAST(i.[Status] AS VARCHAR(5)),'')+ '
              }]' 
        FROM 
            inserted i
        INNER JOIN 
            Auditlog A ON I.AccountId = A.OtherId
      */

    INSERT INTO AuditlogDetails (AuditlogId, OldValue, NewValue)
        SELECT 
            A.AuditlogId, NULL, N'[{
            '+CASE WHEN i.NAME IS NOT NULL THEN '"Name": '+ i.NAME ELSE '' END+
            ' '+ CASE WHEN i.CompanyName IS NOT NULL THEN '"CompanyDetails" : '+ i.CompanyName ELSE '' END+
            ' '+ CASE WHEN i.ContactPhone IS NOT NULL THEN '"ContactPhone" : '+ i.ContactPhone ELSE '' END+
            ' '+ CASE WHEN i.[Status] IS NOT NULL THEN '"Status" : '+  CAST(i.[Status] AS VARCHAR(5)) ELSE '' END+''
        FROM 
            inserted i
        INNER JOIN 
            Auditlog A ON I.AccountId = A.OtherId
END

【讨论】:

  • sr 我想要如果 Name 不为 null 并且 != '' 然后 newvalue += "Name" : ' + ISNULL(i.NAME,'') +',否则不要做
  • if as your code name = null 所以我的新值为 [{ name : ''}] 但我不想在该值为 null 时添加名称
  • 让我试试@beginerdeveloper
  • 我可以问你一个问题,在这种情况下你使用 case when 但是我应该在 if else 时更改 case。 case when 和 if else 哪个性能更好?
  • 没有。您不能在 Select 查询中应用 If Else。而 If Else 的表现优于案例只是一个神话。 @beginerdeveloper
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2010-12-30
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多