首页 > 解决方案 > 使用触发器在第二个表中插入值

问题描述

我有一个名为 [FridgeTemperture] 的表,当插入任何记录时,它应该在新表 MpSensors 中添加一个值。但是插入记录时不会将记录插入新表中。

错误

必须为表“MpSensors”中的标识列指定显式值,或者将标识插入设置为 ON,或者当复制用户插入非复制标识列时。

CREATE TRIGGER [dbo].[FridgeTemperature_INSERT]
   ON  [dbo].[FridgeTemperture]
   AFTER  INSERT
AS 
BEGIN
    SET IDENTITY_INSERT MpSensors ON;

    SET NOCOUNT ON;

    DECLARE @fridge_temp varchar(10)

   INSERT INTO MpSensors(fridge_temp)
       VALUES(@fridge_temp)

       SET IDENTITY_INSERT MpSensors OFF;

END

GO

表模式

CREATE TABLE [dbo].[MpSensors](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [fridge_temp] [varchar](10) NULL
) ON [PRIMARY]



  CREATE TABLE [dbo].[FridgeTemperture](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ShopId] [nvarchar](4) NULL,
        [Fridgetemp] [decimal](4, 2) NOT NULL,
        [UpdatedDate] [datetime2](7) NOT NULL

    GO

标签: sql-servertriggers

解决方案


set identity_insert on如果您不尝试将值插入标识列,则不需要。此外,如果您松开 , 您当前的插入语句set identity_insert将简单地在一个空行中,用于在FridgeTemperture表上成功完成的任何插入语句。
使用触发器时,您可以通过名为insertedand的自动生成表访问由触发触发器的语句影响的记录deleted
我想你在追求这样的事情:

CREATE TRIGGER [dbo].[FridgeTemperature_INSERT]
   ON  [dbo].[FridgeTemperture]
   AFTER  INSERT
AS 
BEGIN

   INSERT INTO MpSensors(fridge_temp)
   SELECT CAST(Fridgetemp as varchar(10)) 
   FROM inserted

END

尽管我真的看不出将相同的值存储在两个不同的位置和两种不同的数据类型中的任何好处。

更新

按照我们在评论中的对话,您可以简单地在触发器中使用更新语句而不是插入语句:

UPDATE MpSensors
SET fridge_temp = (
    SELECT TOP 1 CAST(Fridgetemp as varchar(10)) 
    FROM inserted
    ORDER BY Id DESC
)

这应该为您提供最新的记录,以防您有一个插入语句FridgeTemperture在单个语句中将多条记录插入到表中。


推荐阅读