[英]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
語法DROP
和CREATE
視圖。
另外,當您說“如果我對 table1_name 進行更改”時,您的意思是插入行還是添加列?
您不能將數據插入到視圖中。 您的插入將數據插入到table1_name
表中。 (請參閱可更新和可插入視圖)
如果您想要來自table1_name
和table2_name
的數據,那么您必須在select
中同時擁有table1_name
和table2_name
,基於該視圖創建視圖。
您可以為此使用UNION
* (如果您查詢的兩個表都具有相同的 no/type/set 列):
CREATE VIEW view_name AS
SELECT * FROM table1_name
UNION
SELECT * FROM table2_name
這要求table1_name
和table2_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.