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

Posted

技术标签:

【中文标题】如果数据是从表中更新的,则应将数据插入到 SQL Server 2017 中的另一个表中【英文标题】:If the data is updated from a table, the data should be inserted in another table in SQL Server 2017 【发布时间】:2021-05-21 11:12:59 【问题描述】:

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

表 1:dbo.testing_updated

表 2:dbo.testing_insert

如果使用更新查询更新了表 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

【问题讨论】:

谢谢戈登,我更新了我的问题 但您的标题仍然显示 mysql,而您在删除后添加了 sql server 标记。是哪个? 我删除了 sqlserver 标签 再一次 - 你的问题特别提到了 sql server 2017,但你删除了标签。但是MySQL甚至有@@ROWCOUNT吗? 请将此 SQL 语句的输出添加到您的问题中:SELECT @@version;(这应该避免混淆您使用的内容...) 【参考方案1】:

我不确定您的表架构,但您可以使用表 1 上的触发器来执行此操作,以便在 UPDATE 时插入表 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

【讨论】:

嗨。感谢您的回复。我将在多个表中进行更新。对于示例,我只使用了一张表来更新。我的解决方案应该是如果通过更新查询发生任何数据更改,那么我将在另一个表中插入字段名称。【参考方案2】:

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

这是一个(不相关的)如何创建这样一个表的示例:

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] )
)

【讨论】:

嗨。感谢您的回复。我将在多个表中进行更新。对于示例,我只使用了一张表来更新。我的解决方案应该是如果通过更新查询发生任何数据更改,那么我将在另一个表中插入字段名称。

以上是关于如果数据是从表中更新的,则应将数据插入到 SQL Server 2017 中的另一个表中的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 如果不存在则插入,如果存在则更新

如何在 PL/SQL 中增量集成数据

SQL中插入数据并更新数据的某个字段

如果 mysql 数据库中的表中不存在,则更新或插入多条记录

如果不存在则插入 Spark SQL 中的其他更新

如果不存在则插入数据的过程pl sql