Sql server 如果数据是从表中更新的,则应将数据插入SQL Server 2017中的另一个表中

Sql server 如果数据是从表中更新的,则应将数据插入SQL Server 2017中的另一个表中,sql-server,sql-server-2017,Sql Server,Sql Server 2017,如果数据是从表中更新的,则应将数据插入sqlserver2017中的另一个表中。我将使用此创建SP 表1:dbo.u更新 表2:dbo.u插入 如果使用update查询更新表1中的任何数据,则应在表2中插入更新的列名 我试过了 update dbo.testing_updated set name='a' where name='suba'; IF (@@ROWCOUNT > 0) BEGIN insert into dbo.testing_insert valu

如果数据是从表中更新的,则应将数据插入sqlserver2017中的另一个表中。我将使用此创建SP

表1:dbo.u更新

表2:dbo.u插入

如果使用update查询更新表1中的任何数据,则应在表2中插入更新的列名

我试过了

update dbo.testing_updated set name='a' where name='suba';

IF (@@ROWCOUNT > 0)
    BEGIN
        insert into dbo.testing_insert values('1')
    END
只有在更新任何数据时,才应将该值插入表中。否则,不应更新任何内容。在我的例子中,每次插入数据都与更新无关


选择@版本;为我提供了Microsoft SQL Server 2017

我不确定您的表架构,但您可以使用表1上的触发器在更新时插入表2中。像这样的东西会有用的

DROP TABLE IF EXISTS testing_updated
DROP TABLE IF EXISTS testing_insert

CREATE TABLE testing_updated
(
  [NAME] NVARCHAR(50)
)
GO

CREATE TABLE testing_insert
(
  [name] NVARCHAR(50),
  InsertedValue SMALLINT
)
GO

CREATE TRIGGER tblUpdateTrigger ON testing_updated
AFTER UPDATE
AS
BEGIN
  INSERT INTO testing_insert ([name], InsertedValue)
  SELECT T.[name], 1
  FROM  testing_updated T
  INNER JOIN inserted i ON T.[name]=I.[name] 
END
GO
编辑:

根据您的评论,听起来您想更新多个表。可以通过在同一个源表上创建多个触发器来实现这一点,这些触发器的条件将插入到单独的表中。我不完全清楚您需要的结果是什么,但请参见下文。我想这方面的一些变化会对你有用

DROP TABLE IF EXISTS testing_updated
DROP TABLE IF EXISTS testing_insert1
DROP TABLE IF EXISTS testing_insert2

CREATE TABLE testing_updated
(
  [NAME] NVARCHAR(50)
)
GO

CREATE TABLE testing_insert1
(
  [name] NVARCHAR(50),
  InsertedValue SMALLINT
)
GO

CREATE TABLE testing_insert2
(
  [name] NVARCHAR(50),
  InsertedValue SMALLINT
)
GO

CREATE TRIGGER tblUpdateTrigger1 ON testing_updated
AFTER UPDATE,INSERT
AS
BEGIN
  INSERT INTO testing_insert1 ([name], InsertedValue)
  SELECT T.[name], 1
  FROM  testing_updated T
  INNER JOIN inserted i ON T.[name]=I.[name] AND I.[NAME]='abc'
END
GO

CREATE TRIGGER tblUpdateTrigger2 ON testing_updated
AFTER UPDATE,INSERT
AS
BEGIN
  INSERT INTO testing_insert2 ([name], InsertedValue)
  SELECT T.[name], 1
  FROM  testing_updated T
  INNER JOIN inserted i ON T.[name]=I.[name] AND I.[NAME]='xyz'
END
GO

INSERT INTO testing_updated VALUES ('abc')

SELECT * FROM testing_updated
SELECT * FROM testing_insert1
SELECT * FROM testing_insert2

INSERT INTO testing_updated VALUES ('xyz')

SELECT * FROM testing_updated
SELECT * FROM testing_insert1
SELECT * FROM testing_insert2

看看时态表。他们在每次更新/删除时自动备份记录,您可以相对简单地询问记录在任何给定时间点的外观

下面是如何创建此类表的(不相关)示例:

CREATE TABLE [dbo].[TestOrder](
    [TestOrder_ID] [int] IDENTITY(1,1) NOT NULL,
    [TestOrder_OrderNo] [varchar](15) NOT NULL,
    [TestOrder_Details] [nvarchar](max) NOT NULL,
    [TestOrderState_ID] [tinyint] NOT NULL,
    [ValidFromUtc] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
    [ValidToUtc] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
 CONSTRAINT [PK_TestOrder] PRIMARY KEY CLUSTERED 
(
    [TestOrder_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = ON) ON [PRIMARY],
    PERIOD FOR SYSTEM_TIME ([ValidFromUtc], [ValidToUtc])
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [dbo].[TestOrder_Archive] )
)

谢谢Gordon,我更新了我的问题,但是你的标题仍然是MySQL,而你在删除后又添加了sql server标记。是哪一个?我删除了sqlserver标记,再次-您的问题特别提到了sqlserver 2017,但您删除了标记。但是MySQL是否有
@@ROWCOUNT
?请将此SQL语句的输出添加到您的问题中:
SELECT@@version(这应该避免混淆您使用的内容…)您好。谢谢你的回复。我将在多个表中更新。对于示例,我只使用了一个表进行更新。我的解决方案应该是,如果通过更新查询发生了任何数据更改,那么我将在另一个表中插入字段名。您好。谢谢你的回复。我将在多个表中更新。对于示例,我只使用了一个表进行更新。我的解决方案应该是,如果通过更新查询发生了任何数据更改,那么我将在另一个表中插入字段名。