电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SQL Server 2000的視圖中必須小心使用*符號

瀏覽:138日期:2023-11-06 12:49:06

有些朋友看到這個標題可能會有疑問,難道在視圖中使用*符號還有何要注意的地方嗎?對于這個問題,我們先不必回答,先看一下例子吧。

我這里,使用的數據庫是SqlServer2000自帶的Northwind,這樣方便大家自己私下里測試。首先,創建兩個視圖,視圖的腳本如下:

--視圖 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你就可以看出來這種微妙的變化)

希望在你閱讀了本文以后,你在使用視圖的時候會更加的得心應手,避免錯誤發生。文中有不對的地方歡迎指正批評!

標簽: Sql Server 數據庫
主站蜘蛛池模板: 水上浮桥-游艇码头-浮动码头-游船码头-码瑞纳游艇码头工程 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 永嘉县奥阳陶瓷阀门有限公司| 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 电动百叶窗,开窗器,电动遮阳百叶,电动开窗机生产厂家-徐州鑫友工控科技发展有限公司 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 水上浮桥-游艇码头-浮动码头-游船码头-码瑞纳游艇码头工程 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 周口市风机厂,周鼓风机,河南省周口市风机厂 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 客服外包专业服务商_客服外包中心_网萌科技 | 铸钢件厂家-铸钢齿轮-减速机厂家-淄博凯振机械有限公司 | 天坛家具官网| 顺辉瓷砖-大国品牌-中国顺辉| 求是网 - 思想建党 理论强党 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 无锡网站建设_企业网站定制-网站制作公司-阿凡达网络 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 江苏皓越真空设备有限公司 | 暴风影音| 罗氏牛血清白蛋白,罗氏己糖激酶-上海嵘崴达实业有限公司 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 |