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

时间:2017-10-20 22:26:47

标签: sql sql-server view insert-into

如果我想做一些相对复杂的事情 - 通常由存储过程完成。是否可以使用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 

但我可以在视图中执行此操作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]

是否有替代品(自动)? 任何帮助的赞赏。谢谢你 -

部分解决方案我能想到:

create view test_view as

    select * 
    from [test_album]

    union all

    select 3 as id,
        'Prince' as singer,
        NULL as album_title

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

1 个答案:

答案 0 :(得分:3)

因此,您可能会误解view的作用或insert是什么。视图只是一个选择查询的包装器。它只包含一个select语句,没有别的。 insert将一行数据永久添加到持久表中。您给出的所需行所示的示例似乎足够有效。当然,如果它每次都是你想要的那一行,那么你不希望每次都将该行插入(甚至尝试插入)基础表

这引起了一些问题。

  • 如果你每次总是要联合同一行,为什么不把这一行添加到表中呢?
  • 如果,让我们说,你不希望在基础表中的那一行,很酷。但如果它始终是相同的静态值,为什么需要将它包含在视图中?难道不能只是假设它在那里吗?
  • 如果不能假设总是相同的话,那么每当你需要改变时,你当然不希望改变VIEW身体。因此,如果 要更改并且您不想将其插入基表,则可以创建第二个表,其中包含要在视图中附加到基表的值。然后将基表和“额外值”表合并在一起,而不是单个硬编码行构造函数。