簡體   English   中英

將表插入 SQL 服務器視圖

[英]Inserting a table into a SQL Server view

我已經做了很多研究並試圖弄清楚如何做到這一點,但所建議的一切似乎都對我不起作用。 我使用以下 SQL 創建了一個表:

CREATE VIEW view_name AS SELECT * FROM table1_name

當我對table1_name進行更改時,這些更改會反映在視圖中(如我所願)。 但是,我稍后創建了一個表table2_name並希望以相同的方式將其添加到此視圖中,以便如果我將行添加到表中,它們將反映在視圖中。 所以,我使用了一段類似的代碼,(但使用 insert 代替)

INSERT INTO view_name SELECT * FROM table2_name

但是,現在當我添加table2_name時,這些並沒有反映在視圖中。 我對 SQL (三天前開始)非常陌生,所以我應該看的任何想法或地方將不勝感激。

(注意:我使用的是 SQL 服務器,我似乎不認為這有什么不同,但如果有的話)

謝謝, SaxyTimmy

也許你的意思是(假設列是相同的):

ALTER VIEW view_name
AS
    SELECT col1, col2 FROM table1_name
    UNION ALL
    SELECT col1, col2 FROM table2_name

正如 Joe 指出的那樣,您不會將數據插入到視圖中 - 它不會被持久化(除非它被索引,在這種情況下,您實際上也不會插入到視圖中)。

如果你想更新新表的視圖,你可以這樣做。 我假設您使用的是 SQL Server 2005 或更高版本 - 如果您的學校正在教您 SQL Server 2000,那就為他們感到羞恥。 我還假設了其他一些事情……您的視圖不包含尾隨語句終止符(大約是我唯一一次主張將其排除在外),並且您之前的評論中沒有各種廢話創建視圖命令。

CREATE PROCEDURE dbo.AddTableToView
    @view      SYSNAME,
    @new_table SYSNAME
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX);

    SELECT @sql = [definition] FROM sys.sql_modules
        WHERE [object_id] = OBJECT_ID(@view);

    SELECT @sql = STUFF(@sql, CHARINDEX('CREATE VIEW', @sql), 6, 'ALTER')
        + 'UNION ALL
           SELECT col1, col2 FROM ' + @new_table;

    EXEC sp_executeSQL @sql;
END
GO

但正如我在評論中建議的那樣,這真的不是你想要的 go 的方式,我懷疑你的教授會有同樣的感覺。

您不能以您認為可以的方式將數據插入視圖。 運行插入語句時,實際上是將數據插入到視圖引用的基表 ( table1_name ) 中。 您沒有在視圖和table2_name的行之間創建某種鏈接。

我認為您誤解了視圖到底是什么。 視圖基本上只是一個存儲的查詢。 您實際上並沒有將行插入到視圖中。 盡管您可以擁有一個可更新的視圖,但它會將行插入到基礎表中。

如果要將table2_name添加到視圖中,則需要更改該視圖定義。 如果列與table1_name完全匹配,那么您可以執行以下操作:

ALTER VIEW view_name
AS
    SELECT
        *
    FROM
        table1_name
    UNION ALL
    SELECT
        *
    FROM
        table2_name

或者,您可以使用新定義而不是使用ALTER語法DROPCREATE視圖。

另外,當您說“如果我對 table1_name 進行更改”時,您的意思是插入行還是添加列?

您不能將數據插入到視圖中。 您的插入將數據插入到table1_name表中。 (請參閱可更新和可插入視圖

如果您想要來自table1_nametable2_name的數據,那么您必須在select中同時擁有table1_nametable2_name ,基於該視圖創建視圖。

您可以為此使用UNION * (如果您查詢的兩個表都具有相同的 no/type/set 列):

CREATE VIEW view_name AS
SELECT * FROM table1_name
UNION
SELECT * FROM table2_name

這要求table1_nametable2_name具有相同數量和相同順序的列類型

或者您可以加入另一個表並獲取所有列(或其中的一個子集):

CREATE VIEW view_name AS
SELECT * 
FROM table1_name join table2_name on some_column

* UNION刪除兩個 select 查詢之間的重復項。 如果您確定兩個表中的數據是互斥的,或者您對重復行沒問題,則UNION ALL是一個更好的選擇。 UNION ALL表現更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM