将表插入SQL Server视图

时间:2011-07-19 15:11:50

标签: sql sql-server sql-server-2008

我做了很多研究,并试图弄清楚如何做到这一点,但建议的一切似乎并不适合我。我使用以下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 Server,我似乎并不认为这会产生很大的不同,但是如果有的话)

谢谢, SaxyTimmy

4 个答案:

答案 0 :(得分:6)

也许你打算做什么(假设列是相同的):

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 VIEW命令。

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

但正如我在评论中所说,这真的不是你想去的方式,我怀疑你的教授会有同样的感受。

答案 1 :(得分:3)

您无法以您认为可以的方式将数据插入视图中。运行insert语句时,实际上是将数据插入到视图引用的基表(table1_name)中。您没有在视图和table2_name的行之间创建某种链接。

答案 2 :(得分:3)

我认为你误解了视图究竟是什么。视图基本上只是一个存储的查询。您实际上并未将行插入视图中。虽然您可以拥有可更新的视图,但它会将行插入基础表中。

如果要将table2_name添加到视图,则需要更改该视图定义。如果列与table1_name完全匹配,那么您可以执行以下操作:

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

或者,您可以使用新定义DROPCREATE视图,而不是使用ALTER语法。

另外,当你说“如果我对table1_name进行更改”时,你的意思是插入行还是添加列?

答案 3 :(得分:2)

您无法将数据插入视图中。您的插入将数据插入table1_name表。 (见Updatable and Insertable Views

如果您需要来自table1_nametable2_name的数据,那么您必须在table1_name中同时拥有table2_nameselect,视图是创建

您可以使用 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删除两个选择查询之间的重复项。如果您确定两个表中的数据是互斥的,或者您对重复行没问题,则UNION ALL是更好的选择。 UNION ALL效果更好。