我有下表:
系列一表:
create table tbl1
(
id int,
name varchar(100)
);
insert into tbl1 values(1,'tbl1');
create table tbl2
(
id int,
name varchar(100)
);
insert into tbl2 values(1,'tbl2');
create table tbl3
(
id int,
name varchar(100)
);
insert into tbl3 values(1,'tbl3');
create table tbl4
(
id int,
name varchar(100)
);
insert into tbl4 values(1,'tbl4');
系列双表:
create table tbl11
(
id int,
name varchar(100)
);
insert into tbl11 values(1,'tbl11');
create table tbl22
(
id int,
name varchar(100)
);
insert into tbl22 values(1,'tb22');
create table tbl33
(
id int,
name varchar(100)
);
insert into tbl33 values(1,'tbl33');
create table tbl44
(
id int,
name varchar(100)
);
insert into tbl44 values(1,'tbl44');
现在,我想为每个系列表创建VIEW
:
系列一视图:
create view View_tbl_one_series as
select * from tbl1
union all
select * from tbl2
union all
select * from tbl3
union all
select * from tbl4
系列双人间:
create view View_tbl_double_series as
select * from tbl11
union all
select * from tbl22
union all
select * from tbl33
union all
select * from tbl44
此后,我出于某种原因DROP TABLE tbl1
并创建了另一个VIEW
,其中包含两个序列视图的定义。
查看全部:
create view All_VIEW AS
select * from View_tbl_one_series
union all
select * from View_tbl_double_series
遇到错误:
消息208,级别16,状态1,过程View_tbl_one_series,第2行 无效的对象名称“ tbl1”。
尝试:
exec sp_refreshview View_tbl_one_series
但仍然出现相同的错误。
注意:数据库系统中有很多tables
和views
,创建视图全部是最后一个过程,在这两者之间必须删除一些表原因。
答案 0 :(得分:0)
可以将SQL Server中的非物化视图视为该视图中基础表之上的薄包装。如果删除视图中涉及的一个或多个表,它将无法工作,因为无法再查询该表。这里有许多解决方法,其中一种方法是只创建索引(物化)视图:
CREATE VIEW View_tbl_one_series
WITH SCHEMABINDING
AS
SELECT * from tbl1
UNION ALL
SELECT * from tbl2
UNION ALL
SELECT * from tbl3
UNION ALL
SELECT * from tbl4
GO
CREATE UNIQUE CLUSTERED INDEX idx ON View_tbl_one_series (id);
其他选项包括出于相同目的使用临时表,甚至可能是善意的常规表。
请注意,通常在联合查询中执行SELECT *
并不理想,因为这可能会导致列/列类型可能无法在联合所涉及的两个表之间正确对齐的可能性。