通过视图sql server在相关表中插入数据

Posted

技术标签:

【中文标题】通过视图sql server在相关表中插入数据【英文标题】:insert data in related tables through a view sql server 【发布时间】:2015-04-15 10:12:45 【问题描述】:

希望有人可以提供帮助。我有两个表(结构如下):

Table1
DataYear INT Not Null,
ProvId INT Not Null,
LKId INT Not Null,
UpdateTime Datetime2(2) Not Null,
JTimes INT Not Null

Table2
DataYear INT Not Null,
ProvId INT Not Null,
LKId INT Not Null,
UpdateTime Datetime2(2) Not Null,
IsSuspect BIT,
Recs VARCHAR(10)

两个表的 PK 都是前 4 列。该视图将获取表 1 中的所有值以及表 2 中的最后两列。

我想在视图中插入数据并填充两个表格中的所有列。这可能吗?我该怎么做?

希望有人能帮忙

谢谢

亚历克斯

【问题讨论】:

您不需要填充视图。 没有意义,你将数据插入表中,然后视图读取它们。 不允许在可更新视图中修改多个表。参考这个***.com/questions/7281054/… 你不能插入到一个插入会影响多个表的视图中,就像你不能在一个语句中插入两个表一样。只是一个观察,如果两个表的 PK 相同,为什么需要两个表?为什么不只拥有一个包含 3 个非关键列(JTimes、IsSuspect、Recs)的表?这样您就不会不必要地复制 2 个表中的键列。 感谢您的 cmets 家伙...尝试通过它的原因是避免让应用程序人员更改他们的代码。 GarethD - 它是两个表的原因是因为将填充 10 个不同的提要,但其中只有 2 个具有额外的 2 列,因此避免 80% 的数据有 2 个冗余列 【参考方案1】:

您可以在视图上使用INSEAD OF INSERT 触发器将数据插入到多个表中。

CREATE TABLE dbo.Table1
    (
      DataYear int NOT NULL
    , ProvId int NOT NULL
    , LKId int NOT NULL
    , UpdateTime datetime2(2) NOT NULL
    , JTimes int NOT NULL
    , CONSTRAINT PK_Table1 PRIMARY KEY(
          DataYear
        , ProvId
        , LKId
        , UpdateTime)
    );

CREATE TABLE dbo.Table2
    (
      DataYear int NOT NULL
    , ProvId int NOT NULL
    , LKId int NOT NULL
    , UpdateTime datetime2(2) NOT NULL
    , IsSuspect bit
    , Recs varchar(10)
    , CONSTRAINT PK_Table2 PRIMARY KEY(
          DataYear
        , ProvId
        , LKId
        , UpdateTime)
    );
GO

CREATE VIEW dbo.View1 AS
SELECT 
      Table1.DataYear
    , Table1.ProvId
    , Table1.LKId
    , Table1.UpdateTime
    , Table1.JTimes
    , Table2.IsSuspect
    , Table2.Recs
FROM dbo.Table1
JOIN dbo.Table2 ON
      Table2.DataYear = Table1.DataYear
    AND Table2.ProvId = Table1.ProvId
    AND Table2.LKId = Table1.LKId
    AND Table2.UpdateTime = Table1.UpdateTime
GO

CREATE TRIGGER INSTEAD_OF_INSERT_View1 
ON dbo.View1 INSTEAD OF INSERT AS
INSERT INTO dbo.Table1(
      DataYear
    , ProvId
    , LKId
    , UpdateTime
    , JTimes)
SELECT 
      DataYear
    , ProvId
    , LKId
    , UpdateTime
    , JTimes
FROM inserted;

INSERT INTO dbo.Table2(
      DataYear
    , ProvId
    , LKId
    , UpdateTime
    , IsSuspect
    , Recs)
SELECT 
      DataYear
    , ProvId
    , LKId
    , UpdateTime
    , IsSuspect
    , Recs
FROM inserted;
GO

INSERT  INTO dbo.View1
        ( DataYear
        , ProvId
        , LKId
        , UpdateTime
        , JTimes
        , IsSuspect
        , Recs
        )
VALUES  ( 1
        , 1
        , 1
        , SYSDATETIME()
        , 1
        , 1
        , '1'
        );
GO

【讨论】:

谢谢丹,正是我想要的!

以上是关于通过视图sql server在相关表中插入数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥要插入到 SQL Server 中的视图中? [关闭]

我们 MSAccess 是不是可以通过 SQL Server 中的外部链接视图插入数据? [复制]

SQL Server 视图插入更新

SQL Server创建视图——视图的作用

Sql-Server用insert插入多行数据-语法和例子

如何防止将重复数据插入到值为多个的 SQL Server 表中