2017-10-20 52 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',我試圖使它自動化,所以我不需要不時追加它。 –