问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql视图保存后,查询时总是显示符号非法?

发布网友 发布时间:2022-04-10 04:40

我来回答

2个回答

懂视网 时间:2022-04-10 09:01

,级别 16,状态 1,第 1 行 对象‘View_RosterStudent‘ 依赖于 列‘sName‘。 消息 4922,级别 16,状态 9,第 1 行 由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN sName 失败。

刷新视图问题

消息 15165,级别 16,状态 1,过程 sp_refreshsqlmodule_internal,第 55 行
找不到对象 ‘View_RosterStudent‘,或者您没有所需的权限。

经在网上查找问题相关信息,最终在Stack Overflow发现了同样的问题,在最高赞回答中找到了答案,原因是这个视图架构绑定到了这个表,导致了以上问题,具体细节可百度搜索架构绑定。

但是,因为这个视图创建了索引,且架构绑定是索引所必须的,所以我这里放弃了更改,暂时没有验证重新创建不架构绑定的该视图可以解决以上问题,有兴趣或条件合适的朋友可以尝试一下,可以回复本帖。

 

注:另外导致视图无法刷新的原因可能是MSSQL2008的一个bug,解决方法可以参照这篇文章。

 

(MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决

标签:刷新   级别   依赖   ons   logs   权限   fresh   str   www   

热心网友 时间:2022-04-10 06:09

首先,创建两个视图,视图的脚本如下:

--视图 vCustomersA
create view vCustomersA
as
select CustomerID ,CompanyName,ContactName,ContactTitle,
Address,City,Region,PostalCode,Country,Phone,Fax
from dbo.Customers
go

--视图 vCustomersB
create view vCustomersB
as
select * from vCustomersA
go

然后,使用这两个视图查询客户ID为ALFKI的资料,查询语句如下:

select * from vCustomersA where CustomerID = 'ALFKI'
select * from vCustomersB where CustomerID = 'ALFKI'

查询的结果如下:

一切正常,这个时候,需求发生了变化,我们需要改动vCustomersA,改动后的脚本如下:(为了说明问题,我们只是把CompanyName和ContactName互换一下位置)

--改动后的视图vCustomersA
alter view vCustomersA
as
select CustomerID ,ContactName,CompanyName,ContactTitle,
Address,City,Region,PostalCode,Country,Phone,Fax
from dbo.Customers
go

这个时候,当我们再次使用视图vCustomersB查询客户ID为ALFKI的资料的时候,错误已经悄然来临,你注意到了吗?让我们来看一下这两个视图的查询结果吧,查询语句如下:

select * from vCustomersA where CustomerID = 'ALFKI'
select * from vCustomersB where CustomerID = 'ALFKI'

查询的结果发生变化。你注意到数据的异常了吗?使用视图vCustomersB查询的结果出现了错误,CompanyName显示的资料是:Maria Anders,而在视图vCustomersA查询的结果中CompanyName是:Alfreds Futterkiste。我们仅仅是在vCustomersA中互换了两个字段的位置,再次使用vCustomersB查询数据却发生了数据错位的现象,这是什么原因导致的呢?

 带着这个问题,让我们去了解一下,何谓视图?在Sql Server2000的帮助文档中是这样描述视图的,定义如下:“视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。”通过这个定义我们可以看出,视图是一个虚拟的表,它仅仅包括视图的定义脚本,查询的内容则是动态的生成。当我们创建了一个视图以后,视图的脚本会保存到当前数据库的系统表syscomments里,我们可以通过系统提供的存储过程:sp_helptext查询得到视图的定义脚本。从定义上看,好像并不能得到我们想要的答案,那么我们就先不管Sql Server2000是如何实现视图的,我们先来解决一下当前的问题(我上面提到的)。可能有些朋友已经知道了解决问题的办法了,那就是把vCustomersB的定义脚本重新执行一下(其实只需要把create换成alter执行一下就可以),脚本如下:

--重新执行一下vCustomersB的定义脚本

alter view vCustomersB
as
select * from vCustomersA
go

那么,除了这个方法以外,其实SqlServer2000也提供了一个扩展存储过程sp_refreshview来帮我们做这件事情,调用的脚本如下:

--刷新指定视图的元数据

exec sp_refreshview 'vCustomersB'

我个人目前就知道这两个办法,不知道,你还有没有其他的办法,有的话可以一起分享一下。

sp_refreshview的功能描述为:“刷新指定视图的元数据。由于视图所依赖的基础对象的更改,视图的持久元数据会过期。”由于sp_refreshview的代码被封装了(没有公开),所以我们看不到它的内部实现,不过看了这个存储过程的描述,你是否对视图有了新的认识呢?

从这里,我们可以看到,当我们使用一个视图查询数据的时候,其实我们是在使用视图的元数据来查询的,当视图依赖的对象发生了变化以后,视图的元数据就需要更新,这样,使用视图时才不会违背我们的意愿。

知道了问题的产生的原因后,那么我们在重新修改一个表或视图的脚本时,我们就需要更新依赖于该对象的视图,否则就会出现意想不到的错误。如何找到依赖于该对象的对象(包括视图,触发器,存储过程)呢?SqlServer2000在该数据库的系统表sysdepends里记录这些依赖关系,所以你可以查询该表获取你想要的信息,但其实,你可以通过使用系统提供的存储过程:sp_depends来获取该对象的所依赖的对象(返回的第一个表)以及依赖于该对象的对象(返回的第二个表),脚本如下:

--查询vCustomersA的依赖的对象以及依赖于vCustomersA的对象

exec sp_depends 'vCustomersA'

查询的结果如下:

注:sp_depends的代码是公开的,有兴趣的可以看一下其实现过程。

到此,你应该明白,当你更新你的表或视图的时候,你还要刷新依赖于这些对象的视图的元数据,即需要调用sp_refreshview来刷新依赖于该对象的视图。但是你在查询依赖于一个表或者视图的对象集合的时候需要注意的一点是,在你更新了一个表或视图之后,那些之前创建的依赖于该表或视图的依赖关系将会丢失(你更新的表或视图所依赖的对象集合不会丢失),用我之前的例子来看,vCustomersB依赖于vCustomersA,那么当我们修改了vCustomersA以后,vCustomersB与vCustomersA之间的依赖关系将会丢失而vCustomersA所依赖的Customers将不会丢失(依赖关系在对象创建或更新时创建,更新时,会把先前的依赖关系删掉)。(调用sp_depends你就可以看出来这种微妙的变化)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
y53s手机参数及价格 vivoy53s5g手机参数 五粮液五粮印象精制52度浓香型白酒500ml 五粮液 五粮印象 精制 52度 浓香型白酒 500ml-详细介绍 五粮液 五粮印象 精制 52度 浓香型白酒 500ml-购买最佳价格 五粮液 五粮印象 精制 52度 浓香型白酒 整箱装-详细介绍 五粮液五粮印象珍品-适用对象 白酒推荐-五粮液五粮印象珍品52%vol浓香型白酒500ml单瓶装 五粮液五粮印象精制52度浓香型白酒-适用对象 星座血型生肖分析摩羯座属蛇A型 小米手机为什么用wifi用不了快手 为啥小米4安装不了快手? 为什么小米2s上不了快手了 红米手机下不了快手怎么回事,求帮助 我的手机是红米 安装不了快手 但是其它软件可以安装 要怎么才能安装快手 小米手机3 卸载快手一次以后再下载就安装不了了 总是显示安装出错 有内存 是怎么回事 OPPOR11s和OPPOR11一样大吗,音量键位置相同吗,充电插口一样位置吗 我是小米3为什么在应用商店下载快手安装失败 OPPOr11s 密码解锁忘了 刚刚按音量上键和下键 搞的手机现在开不了机了 #在线客服#为什么oppor11s手机键无法操作媒体音量啊?总是调节第一个通话铃声音量。 oppor11splus音量键和电源键不好使和刷机有关系吗? 2014年广东汕尾陆河县中考体育是怎么算分的,比如跑步得60,跳绳得了60,那么按30分满分算是怎 OPPOR11s拍照快门键可以用音量键吗? 2018汕尾中考最低高中录取分数线会超过330吗? 我是广东省汕尾市陆丰县甲子镇的初三学生。中考我考了560分科目分数。加上满分30分体育分,梦想考上广... OPPOR11s可以使用音量键拍照吗? 广东汕尾生物地理是否加入来年的中考成绩? oppor11s听筒声音小解决方法 广东省的中考总分不一致,要怎么按中考成绩上不同总分的学校呢? 汕尾市中考体育测试满分标准 红烧茄子怎样做口感会更好,味道美味? 商鞅死亡的真相是什么,印证了什么家喻户晓的千古悲剧? 淘宝购物用信用卡已被扣款 支付宝仍显示未付款 等待买家付款? 支付宝已扣钱,可是订单是等待支付,这可怎么办 支付宝等待买家付款但是我不打算买了会扣钱么 我在owhat买了东西付了款了支付宝都已经扣了钱了可是还是显示待付款是怎么回事? 用支付宝扣款成功了为什么还显示待付款 在手机设置里面清除搜狐视频的数据会不会清除已下载的影片 苹果手机怎么彻底清除微信聊天记录? 中国联通人工服务怎么打? 港币1450是多少人民币 11200港币等于多少人民币 195700港币人民币是多少? 13100港币等于多少人民币 怎么打联通人工客服 怎么联系联通人工客服 1560港币等于多少人民币 联通卡如何人工服务 1680港币等于多少人民币 2.446港币可以兑换多少人民币?