Sql Server中的系統(tǒng)視圖詳細(xì)介紹
本來想這個(gè)系列寫點(diǎn)什么好呢,后來想想大家作為程序員,用的最多的莫過于數(shù)據(jù)庫了,但是事實(shí)上很多像我這樣工作在一線的碼農(nóng),對sql都一知半解,別談優(yōu)化和對數(shù)據(jù)庫底層的認(rèn)識(shí)了,我也是這樣。。。
一:那些系統(tǒng)視圖
1. 系統(tǒng)視圖是干什么呢?
從名字上看就知道,系統(tǒng)視圖嘛?猜的不錯(cuò)的話,就是存放一些sqlserver系統(tǒng)的一些信息,很好,恭喜你,答對了。
2. 都定義在哪呢?
為了讓你眼見為實(shí),下面截圖看看,從截圖中你可以看到,不管是“系統(tǒng)數(shù)據(jù)庫”還是“用戶數(shù)據(jù)庫”都是有這些系統(tǒng)視圖的,而且一眼掃下去發(fā)現(xiàn)連名字都一樣。
3.看看這些系統(tǒng)視圖都能帶給我什么福利?
Q1:我在維護(hù)一個(gè)系統(tǒng)的時(shí)候,我只知道有一個(gè)數(shù)據(jù)庫中,有一個(gè)表的字段叫 “state”,但我忘了是定義在那張表中?我該如何找出來?
A1: 這個(gè)簡單,在sqlserver里面提供了一個(gè)系統(tǒng)視圖叫“INFORMATION_SCHEMA.COLUMNS”,下面我們截圖看看。
從這個(gè)系統(tǒng)視圖名字中的這個(gè)SCHEMA這個(gè)單詞可知,原來是一個(gè)保存表架構(gòu)的視圖,而且還有這個(gè)字段的“排位”,“默認(rèn)值”這些特性,泥煤,是不是有一種很爽的感覺???
Q2:我在C#代碼中看到了一個(gè)存儲(chǔ)過程名"CategoryInsert",我想看它的源碼,但是我的table中存儲(chǔ)過程有幾千個(gè),總不能讓我 一個(gè)個(gè)的去找吧,,,拜托在系統(tǒng)視圖中可有快捷的方法查看?
A2:so easy。。。告訴你吧,只有你想不到的,沒有系統(tǒng)視圖做不到,不就一個(gè)簡簡單單的看存儲(chǔ)過程代碼么?sys.sql_modules就可以幫你實(shí)現(xiàn)。
Q3:這種方法好是好,但是copy的definition字段是沒有格式化的。。。。大哥,上千行的sql哦。。。我特別想格式化的輸出怎么辦呀?謝謝了。
A3:確實(shí)如你所說,格式化輸出的話,系統(tǒng)View只能幫你到這了,不過天無絕人之路,你可以使用系統(tǒng)存儲(chǔ)過程,里面有一個(gè)神奇的sp_helptext,可以祝你實(shí)現(xiàn)夢想,不用謝。
二:對系統(tǒng)視圖的一些思考
在上面的代碼中,我演示了兩個(gè)系統(tǒng)view,一個(gè)proc給我們帶來的福利,那么仔細(xì)看一看,你就會(huì)有兩個(gè)疑惑。。。。
1:系統(tǒng)View在哪定義的?
這個(gè)問題問的真好,從文章開頭我們就知道,我的用戶庫MYPETSHOP是有很多系統(tǒng)view的,但是我真的沒有定義這些view呀,老天可以給我作證,那問題就很神秘了,system view到底從何而來?這個(gè)問題你也只有問sqlserver團(tuán)隊(duì)了,他們將system view都放入了一個(gè)隱藏的resource數(shù)據(jù)庫,那這個(gè)數(shù)據(jù)庫在哪呢?我給你找到。
找到了之后,我現(xiàn)在繼續(xù)附加進(jìn)來,如果你夠聰明的話,你不能直接加載它,否則會(huì)報(bào)進(jìn)程正在使用中,原因我想你也知道。
解決方法也很簡單,我們做一份copy到E盤。然后附加這個(gè)copy就好了。
既然附加進(jìn)來了,我現(xiàn)在的感覺就是迫不及待的去看一看,細(xì)心的你通過下面的截圖,我想你應(yīng)該明白了些什么,這些view并不是在”系統(tǒng)視圖“文件夾下面的,而是正真的作為用戶視圖。。。對不對。。。
2:系統(tǒng)view的數(shù)據(jù)源在何處?
這個(gè)也是很經(jīng)典的問題,既然是view,我想大家都明白,其實(shí)它就是虛表的意思,既然是虛表,那基礎(chǔ)表在何處?帶著這個(gè)問題我來翻一下我的MYPETSHOP數(shù)據(jù)庫。
可以看到,上面的系統(tǒng)基表空空如也,黃鶴一去不復(fù)返,白云千載空悠悠。。。那更大的疑問來了,如果連基礎(chǔ)表都沒有,那在這個(gè)DB中的system view到底是查誰呢?這不是大忽悠么???但是事實(shí)是真的沒有嗎?因?yàn)槟銢]看到不代表真的沒有,可以繼續(xù)用system view來祝我們一臂之力,接下來用sys.objects一探究竟。。。
好了,大概就說這么多了,時(shí)候不早了,洗洗睡了。。。
- SQL Server 利用觸發(fā)器對多表視圖進(jìn)行更新的實(shí)現(xiàn)方法
- 細(xì)說SQL Server中的視圖
- 簡析SQL Server數(shù)據(jù)庫用視圖來處理復(fù)雜的數(shù)據(jù)查詢關(guān)系
- 解析SQL Server 視圖、數(shù)據(jù)庫快照
- Sql Server中的視圖介紹
- SQL SERVER先判斷視圖是否存在然后再創(chuàng)建視圖的語句
- sql server判斷數(shù)據(jù)庫、表、列、視圖是否存在
- SQL server 視圖(view)介紹
- 存儲(chǔ)過程解密(破解函數(shù),過程,觸發(fā)器,視圖.僅限于SQLSERVER2000)
- SQL Server視圖的講解
相關(guān)文章
sql server使用公用表表達(dá)式CTE通過遞歸方式編寫通用函數(shù)自動(dòng)生成連續(xù)數(shù)字和日期
CTE是在內(nèi)存中準(zhǔn)備好數(shù)據(jù),而不是每次一條往返服務(wù)器和客戶端一次。如果需要再插入到臨時(shí)表的話就是全部數(shù)據(jù)一次性插入。 這篇文章主要介紹了sql server使用公用表表達(dá)式CTE通過遞歸方式編寫通用函數(shù)自動(dòng)生成連續(xù)數(shù)字和日期 ,需要的朋友可以參考下2019-07-07SQL Server的通用分頁存儲(chǔ)過程 未使用游標(biāo),速度更快!
使用SQL Server時(shí),分頁處理一直是個(gè)比較棘手的問題2010-11-11解決MSSQL2005遠(yuǎn)程連接sql2000非默認(rèn)端口數(shù)據(jù)庫的問題
MSSQL2005連接sql2000非默認(rèn)端口數(shù)據(jù)庫的問題給我折騰了快一天了,快瘋了,連接TCP/IP默認(rèn)1433端口沒問題,連接其他端口數(shù)據(jù)庫問題有了。2007-11-11SQL Server數(shù)據(jù)庫自動(dòng)備份的實(shí)現(xiàn)步驟
要編寫一個(gè)自動(dòng)備份 SQL Server 數(shù)據(jù)庫的腳本,可以使用 SQL Server Management Studio (SSMS) 或者 Transact-SQL (T-SQL) 腳本,本文給大家介紹了一個(gè)一個(gè)簡單的 T-SQL 腳本示例,需要的朋友可以參考下2023-11-11SqlServer高版本數(shù)據(jù)備份還原到低版本
這篇文章主要為大家詳細(xì)介紹了SqlServer高版本數(shù)據(jù)備份還原到低版本的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Sql注入原理簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。下面通過本文給大家分享sql 注入原理解析,感興趣的朋友一起看看吧2017-08-08SQL Server怎么找出一個(gè)表包含的頁信息(Page)
這篇文章主要給大家介紹了關(guān)于SQL Server是如何找出一個(gè)表包含的頁信息(Page)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SQL Server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10