在 VIEW 的定义中使用 INSERT:CREATE VIEW AS INSERT INTO

YJZ*_*YJZ 0 sql sql-server view insert-into

如果我想做一些相对复杂的事情——通常由存储过程完成的事情。是否可以使用 a 使其自动VIEW

我的具体情况:

我想要输出表 = 输入表 A + 一些行输入表 B。在存储过程中,我可以先复制表 A,然后再复制INSERT INTO它,但在视图中不允许这样做。

简化示例:

输入表为[test_album],输出表 = 输入表 + 歌手王子。

--create test data
IF OBJECT_ID('[dbo].[test_album]', 'U') IS NOT NULL 
    DROP TABLE [dbo].[test_album] 

CREATE TABLE [test_album] ( 
    id int not null identity(1, 1) primary key, 
    singer VARCHAR(50) NULL, 
    album_title VARCHAR(100) NULL 
    ) 

INSERT INTO [test_album] (singer, album_title) 
    VALUES ('Adale', '19'), 
        ('Michael Jaskson', 'Thriller')

--this can be executed as sql code or in stored proc
SELECT *
INTO [result_table]
FROM [test_album]

INSERT INTO [result_table] ([singer])
    VALUES ('Prince') 

select *
from [result_table]
--id    singer  album_title
--1 Adale   19
--2 Michael Jaskson Thriller
--3 Prince  NULL
----as expected 
Run Code Online (Sandbox Code Playgroud)

但是我可以INSERT INTO在视图中执行此操作。

真实案例:

其他歌手在表中 [extra_singers]

[test_album] 可能有许多其他列(或架构可能会更改),因此最好不要在代码中键入所有列名。

--create test data
IF OBJECT_ID('[dbo].[test_album]', 'U') IS NOT NULL 
    DROP TABLE [dbo].[test_album] 
IF OBJECT_ID('[dbo].[extra_singers]', 'U') IS NOT NULL 
    DROP TABLE [dbo].[extra_singers] 
IF OBJECT_ID('[dbo].[result_table]', 'U') IS NOT NULL 
    DROP TABLE [dbo].[result_table]         

CREATE TABLE [test_album] ( 
    id int not null identity(1, 1) primary key, 
    singer VARCHAR(50) NULL, 
    album_title VARCHAR(100) NULL,
    many_other_columns VARCHAR(100) NULL
    ) 

INSERT INTO [test_album] (singer, album_title) 
    VALUES ('Adale', '19'), 
        ('Michael Jaskson', 'Thriller')


CREATE TABLE [extra_singers] ( 
    [id] int not null identity(1, 1) primary key, 
    [name] VARCHAR(50) NULL )

INSERT INTO [extra_singers] ([name]) 
    VALUES ('Prince'), 
        ('Taylor Swift')


--append [extra_singers] to [test_album]
--this can be executed as sql code or in stored proc
SELECT *
INTO [result_table]
FROM [test_album]

INSERT INTO [result_table] ([singer])
    SELECT [name]
    FROM [extra_singers]
Run Code Online (Sandbox Code Playgroud)

有没有替代方案(即自动)?任何帮助表示赞赏。感谢你-


我能想到的部分解决方案

create view test_view as

    select * 
    from [test_album]

    union all

    select 3 as id,
        'Prince' as singer,
        NULL as album_title
Run Code Online (Sandbox Code Playgroud)

但是您必须知道其中的所有列名,[test_album]并且不能让 column [id] 自动递增

Xed*_*dni 5

所以你可能误解了 a 是什么view,或者 aninsert是什么。视图只是单个选择查询的包装器。它只包含一个select语句,没有其他任何内容。一个insert永久添加数据一行到一个持久表。你给出的例子你只是联合你想要的行似乎足够有效。当然,如果它每次都是您想要的同一行,您就不会希望每次都将该行插入(甚至尝试插入)底层表中

不过,这提出了几个问题。

  • 如果您每次总是要合并同一行,为什么不将该行添加到表中?
  • 如果,假设,您不希望底层表中的那一行,很酷。但是如果它总是相同的静态值,为什么需要将它包含在视图中?不能假设它在那里吗?
  • 如果不能假设它总是相同的,那么您当然不希望VIEW每次需要改变身体时都改变它。因此,如果要改变,你不希望将其插入到基表,也许使包含要追加到视图基表中的值的第二个表。然后将基表和“额外值”表联合在一起,而不是一个单一的、硬编码的行构造函数。