2017-10-20 51 views
0

如果我想做一些相对复杂的事情 - 通常由存储过程完成。是否有可能使用VIEW自动生成?使用INSERT内部的INSERT定义:CREATE VIEW AS INSERT INTO

我的具体情况:

我想输出表=输入表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] 

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


部分解决我能想到的:

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

这没有任何意义。你能澄清吗? – SqlZim

+2

视图意味着显示底层数据。插入并不适合这一点。如果您不想直接插入数据,存储过程将更适合您正在尝试执行的操作。 – indiri

+0

@SqlZim我需要在每次使用它时向表中添加一行。我试图用'VIEW'自动化这个。所以视图应该=输入表格+额外的一行 –

回答

3

所以你可能会误解view做什么或insert是什么。视图仅仅是一个选择查询的包装。它只包含一个select声明,没有别的。 insert永久性地向持久表添加一行数据。你给联合你想要的行的例子看起来足够有效。当然,如果它每次都是你想要的同一行,那么你不希望每次插入(甚至试图插入)该行到底层表中。

虽然这引发了一些问题。

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

谢谢@Xedni - 为我澄清了很多!我现实生活中的情况是'output table' =输入'table A' +根据'table B'增加了一些行。我的同事们可能会更新'表A'和'表B',我试图使它自动化,所以我不需要不时追加它。 –