Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用触发器如何复制刚刚插入的行_Sql_Sql Server_Triggers - Fatal编程技术网

Sql 使用触发器如何复制刚刚插入的行

Sql 使用触发器如何复制刚刚插入的行,sql,sql-server,triggers,Sql,Sql Server,Triggers,我使用的是SQL Server 2008,我有一个触发器,我想将My\u表中的任何行复制到存档History\u表表中 如何在每次有人插入新行时将表的所有旧内容复制到存档中 我的桌子结构是 CREATE TABLE [dbo].[Stu_Table] ( [Stu_Id] [int] NOT NULL, [Stu_Name] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [Stu_Cla

我使用的是SQL Server 2008,我有一个触发器,我想将
My\u表
中的任何行复制到存档
History\u表
表中

如何在每次有人插入新行时将表的所有旧内容复制到存档中

我的桌子结构是

    CREATE TABLE [dbo].[Stu_Table]
    (
    [Stu_Id] [int] NOT NULL,
    [Stu_Name] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Stu_Class] [int] NULL
    ) ON [PRIMARY]
    GO

ALTER TABLE [dbo].[Stu_Table] ADD CONSTRAINT [PK_Stu_Table] PRIMARY KEY CLUSTERED  ([Stu_Id]) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Stu_TableHistory]
(
[Stu_Id] [int] NOT NULL,
[Stu_Name] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Stu_Class] [int] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Stu_TableHistory] ADD CONSTRAINT [PK_Stu_TableHistory] PRIMARY KEY CLUSTERED  ([Stu_Id]) ON [PRIMARY]
GO
我的存档表结构是

    CREATE TABLE [dbo].[Stu_Table]
    (
    [Stu_Id] [int] NOT NULL,
    [Stu_Name] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Stu_Class] [int] NULL
    ) ON [PRIMARY]
    GO

ALTER TABLE [dbo].[Stu_Table] ADD CONSTRAINT [PK_Stu_Table] PRIMARY KEY CLUSTERED  ([Stu_Id]) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Stu_TableHistory]
(
[Stu_Id] [int] NOT NULL,
[Stu_Name] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Stu_Class] [int] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Stu_TableHistory] ADD CONSTRAINT [PK_Stu_TableHistory] PRIMARY KEY CLUSTERED  ([Stu_Id]) ON [PRIMARY]
GO
我的触发器语法是

Create TRIGGER [dbo].[HistoryKeep]
   ON  [dbo].[Stu_Table]
   INSTEAD OF  INSERT
AS 
BEGIN
    IF((SELECT COUNT(*) FROM Stu_Table WHERE Stu_Id = (SELECT Stu_Id FROM INSERTED)) >= 1)
    BEGIN
        INSERT INTO dbo.Stu_TableHistory( Stu_Id, Stu_Name, Stu_Class )
        SELECT Stu_Id, Stu_Name, Stu_Class FROM Stu_Table WHERE Stu_Id = (SELECT Stu_Id FROM INSERTED)

        UPDATE x
        SET x.Stu_Name = i.Stu_Name
        FROM dbo.Stu_Table AS x
        INNER JOIN inserted AS i ON i.Stu_Id = x.Stu_Id

    END
    ELSE
    BEGIN
        INSERT INTO dbo.Stu_Table( Stu_Id, Stu_Name, Stu_Class )
        SELECT Stu_Id, Stu_Name, Stu_Class FROM INSERTED
    END
END
总之,我们需要帮助将旧数据从学生表传输到存档表。我的上述触发器语法不能满足我的要求


如果您有任何疑问,请提前询问“谢谢”。

您应该有如下内容,而不是当前的触发器:

Create TRIGGER [dbo].[HistoryKeep]
   ON  [dbo].[Stu_Table]
   INSTEAD OF  INSERT
AS 
BEGIN
DECLARE @History table (
    Action sysname not null,
    STU_ID [int] NULL,
    [Stu_Name] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Stu_Class] [int] NULL
)

;MERGE INTO Stu_Table t
USING INSERTED i ON t.STU_ID = i.STU_ID
WHEN MATCHED THEN UPDATE SET STU_Name = i.STU_Name
WHEN NOT MATCHED THEN INSERT (STU_ID,STU_NAME,STU_CLASS) VALUES (i.STU_ID,i.STU_NAME,i.STU_CLASS)
OUTPUT $Action,deleted.stu_id,deleted.stu_name,deleted.stu_class INTO @History;

INSERT INTO stu_TableHistory (stu_id,stu_name,stu_class)
select stu_id,stu_name,stu_class from @History where Action='UPDATE'
END
另外,请注意,您需要删除
STU TableHistory
上的当前PK约束,因为只要一行更新多次,就会有两个条目包含相同的
STU ID


根据我的评论,这将
INSERTED
视为一个包含多行的表。因此,如果
Stu Table
包含一行
Stu ID
1,则插入以下内容:

INSERT INTO STU_Table (STU_ID,STU_Name,STU_Class) VALUES
(1,'abc',null),
(2,'def',null)

将更新
STU-ID
1的行,为
STU-ID
2插入一行,并在
STU-tableHistory
中插入一行(对于
STU-ID
1)

INSERTED
是一个伪表,可以包含多行。您需要编写接受这种现实的查询。假设
SELECT STU_ID from INSERTED
将返回1个结果,则您的代码被破坏。并且它可能包含混合行-一些行的
更新是合适的,另一些行的普通
插入是合适的。Damien_不信者感谢您的回复,不理解您的评论描述,您是否愿意与我们分享一些语法和详细的描述。谢谢查看这里有关
Inserted
Deleted
表的文档: