细说Sql Server中的视图.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
细说Sql Server中的视图.doc

细说Sql Server中的视图(上) 什么是视图? 视图中的ORDER BY; 刷新视图; 更新视图; 索引视图; ? 1.什么是视图 ?? 视图是由一个查询所定义的虚拟表,它与物理表不同的是,视图中的数据没有物理表现形式,除非你为其创建一个索引;如果查询一个没有索引的视图,Sql Server实际访问的是基础表。 ?? 如果你要创建一个视图,为其指定一个名称和查询即可。Sql Server只保存视图的元数据,用户描述这个对象,以及它所包含的列,安全,依赖等。当你查询视图时,无论是获取数据还是更新数据,Sql server都用视图的定义来访问基础表; ?? 视图在我们日常操作也扮演着许多重要的角色,比如可以利用视图访问经过筛选和处理的数据,而不是直接访问基础表,以及在一定程度上也保护了基础表。 ?? 我们在创建视图的时候,也要遵守三个规则: 不能在视图定义中指定ORDER BY ,除非定义中包含Top或For Xml 说明; 所有的列必须有列名; 这些所有的列名必须唯一; ??? 对于视图表中在没有top或for xml说明的情况下,不能有Order by 语句,这是因为视图被认为是一个表,表是一个逻辑的实体,它的行是没有顺序的。视图中所有列必须有列名,且唯一的情况我想大家都理解; 下面的sql语句表示创建一个简单的视图: 1: CREATE VIEW dbo.V1 2: AS 3: SELECT CustomerID,CompanyName FROM Customers 4: WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) 2.视图中的ORDER BY 视图表示一个逻辑实体,它与表非常类似; 如果我们在上面的创建的sql语句中加一个Order BY 语句,看看有什么效果: 1: ALTER VIEW dbo.V1 2: AS 3: SELECT CustomerID,CompanyName FROM Customers 4: WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) 5: ORDER BY CompanyName ? 运行该语句将会失败,回收到以下的提示: Msg 1033, Level 15, State 1, Procedure V1, Line 5 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。 根据提示,ORDER By 也不是不能用,只有指定了Top或for xml语句后,ORDER BY 才能使用,如: ? 1: ALTER VIEW dbo.V1 2: AS 3: SELECT TOP(10) CustomerID,CompanyName FROM Customers 4: WHERE EXISTS(SELECT * FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) 5: ORDER BY CompanyName ????? 但是,并不建议在视图中使用ORDER BY ,这是因为视图表示一个表,而对于表来说,是不会有排序的;所以建议在查询视图的时候,用ORDER BY; ????? SQL Server2005联机丛书有一段这样的描述:“在视图、内联函数、派生表或子查询的定义中使用ORDER BY 字句,子句只能用户确定TOP子句返回的行。ORDER BY 不保证在查询这些构造时得到有序结果,除非在查询本省也指定了ORDER BY.” 3.刷新视图 我在上面说过,视图会保存元数据,列,安全,以及依赖等信息,如果我们把基础表的架构更改了,并不会直接反映到视图上来;更改架构后,使用sp_refreshview存储过程刷新视图的元数据是一个好习惯; 比如我们创建了一个表T1和一个T1的视图V1,然后更改T1,再看V1的结果: 首先创建表T1: ? 1: IF OBJECT_ID(T1) IS NOT NULL 2: DROP TABLE T1 3: ? 4: CREATE TABLE T1(col1 INT,col2 INT) 5: INSERT INTO T1(col1,col2) VALUES(1,2) 6:

文档评论(0)

wsh1288 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档