--创建视图
--视图只会引用存放在表中的数据
--使用代码创建视图
create view viewname --创建视图
as
sql select statement
alter view viewname --修改视图
as
sql select statement
drop view viewname --删除视图
create view v_eventlist
as
select ct.name as customertypename,c.lastname,c.firstname,c.nickname,emc.confirmdate,
e.code,e.datebegin,t.name as tourname,b.name as basecampname,e.comment
from tour as t
join event as e on e.tourid=t.tourid
join event_mm_customer as emc on emc.eventid=e.eventid
join customer as c on c.customerid=emc.customerid
join customertype as ct on ct.customertypeid=c.customertypeid
join basecamp as b on b.basecampid=t.basecampid
--视图不能包含select into选项
--视图不能引用临时表(名字中包含#的表)或者表变量
--视图不能包含compute或者compute by列,它只能使用标准的聚合函数和分组功能
--with check option 子句
--利用with check option子句,视图的where子句除了可以用来筛选检索的数据以外,还可以对插入和更新的数据进行检查。
--也就是说加了它后,对此视图的插入和更新数据都要符合构成此视图语句的where子句的条件(符合where条件的数据才能插入和更新)。
create view v_chatour
as
select [name] as tourname,basecampid
from tour
where basecampid=2
with check option
insert v_chatour (tourname,basecampid) values ('ccc',1) --插入失败
insert v_chatour (tourname,basecampid) values ('www',2) --插入成功
--在创建视图的sql语句中若没有TOP则不能使用order by
create view v_chatour
as
select top 10 basecampid,[name] as tourname --若没有此处的top 10,则下面的order by 出错
from tour
order by basecampid
--使用架构绑定选项(with schemabinding),为视图锁定基础表
create table test(fullname char(20))
create view v_test
with schemabinding
as
select fullname from dbo.test --*必须指定表的所有者dbo等
alter table test
alter column fullname char(30) --无法修改
--with encryption,加密视图源代码
select text from syscomments join sysobjects on sysobjects.id=syscomments.id --系统表中获得视图源代码
where name='v_test'
alter view v_test
with encryption --加密。加密后再执行上面的语句视图源代码就会乱码了。去掉此行,再执行此段代码,则解密。
as
select fullname from dbo.test
--可更新的视图
--1.只能对一个表进行更新
--2.可以使用视图或者基础表上的instead of触发器来对数据修改操作进行变更
--3.如果在视图中包含了聚合函数或者group by子句,那么视图就是不可更新的
--4.如果在视图中把一个子查询作为导出表来引用,,那么就不能将这个导出表中的任何一列作为视图的列输入,但是,可以在作为导出表的子查询中使用聚合函数
--5.如果视图包含了with check option ,那么,对视图的insert和update操作就必须满足where子句中条件的要求
--6.要对进行insert或者update操作的列必须对应于基础表中的唯一一个列。如果同一个列名出现在两个表,就应该在选择列表中明确地使用table.column的方式来唯一地标识它