天天看點

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

<a href="#_labelContents">本文所涉及的内容(Contents)</a>

<a href="#_labelContexts">背景(Contexts)</a>

<a href="#_labelSQLCodes">實作代碼(SQL Codes)</a>

<a href="#_labelOne">方法一:遊标 + 系統存儲過程sp_MSForEachDB</a>

<a href="#_labelTwo">方法二:封裝sp_MSforeachtable + sys.databases</a>

<a href="#_labelThree">方法三:系統存儲過程sp_MSForEachDB + sp_MSforeachtable</a>

<a href="#_labelFour">方法四:擴充sp_MSforeachdb + sp_MSforeachtable</a>

<a href="#_labelReferences">參考文獻(References)</a>

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure1:某資料庫所有表資訊)

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure2:所有資料庫所有表資訊)

下面内容講述了在實作Figure2過程中遇到的一些問題,如果你對這些問題不感興趣可以直接看最後實作的SQL腳本。下面講述了4種實作方法:

  1. 遊标 + 系統存儲過程sp_MSForEachDB,實作腳本為Script3;

  2. 封裝sp_MSforeachtable + sys.databases,實作腳本為Script4和Script5;

  3. 系統存儲過程sp_MSForEachDB + sp_MSforeachtable,實作腳本為Script6;

  4. 擴充sp_MSforeachdb + sp_MSforeachtable,實作腳本為Script7;

  1) 既然有了擷取某個資料庫所有表資訊的腳本,那就可以在外層再套使用sp_MSForEachDB系統存儲過程,下面的Script1腳本可以擷取到所有資料庫的所有表的資訊,效果如Figure3所示:

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure3:所有資料庫所有表)

  2) 上圖Figure3有兩個缺點,第一是傳回的資料太分散,沒有統一表進行管理,第二是需要過濾master、model、msdb和tempdb等系統資料庫,因為我們完全不關心系統資料庫,下面的SQL腳本展示在使用sp_msforeachdb的時候如何排除某個資料庫,效果如Figure4所示:

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure4:sp_msforeachdb排除某個資料庫)

  3) 下面的SQL腳本展示在使用sp_msforeachdb的時候如何排除多個資料庫,效果如Figure5所示:

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure5:sp_msforeachdb排除多個資料庫)

  4) 把上面的SQL腳本運用到之前擷取某個資料庫表資訊的SQL腳本中,但是執行的過程中出現了Figure6的錯誤資訊:

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure6:錯誤資訊)

  5) 經過一番查找,最後發現是因為AdventureWorksLT2008R2資料庫的安全中的架構是SalesLT,不是預設的dbo,是以報了Figure6的錯誤資訊,但是如果使用sp_MSforeachtable,那就不用理會架構的問題。

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure7:SalesLT架構名)

隻要我們在表名稱前面加入正确的架構名,那就可以正确執行了,如Figure8所示:

SQL Server 遊标運用:檢視所有資料庫所有表大小資訊(Sizes of All Tables in All Database)一.本文所涉及的内容(Contents)二.背景(Contexts)三.實作代碼(SQL Codes)四.參考文獻(References)

(Figure8:正确的架構名)

  6) 經過上面經驗的總結,關于所有資料庫所有表的資訊的SQL腳本就水到渠成了,下面就是全部的SQL腳本,注意過濾的方式可以寫成:IF ''?'' like(''A%'') ,執行的效果如Figure2所示:

<a href="http://blog.csdn.net/lee576/article/details/1327801">與存儲過程sp_MSforeachdb類似的存儲過程sp_MSforeachdb</a>

<a href="http://www.searchdatabase.com.cn/showcontent_22780.htm">SQL Server資料庫開發頂級技巧</a>

<a href="http://www.cnblogs.com/acis_/archive/2009/07/28/1532614.html">sp_MSforeachtable使用方法</a>

<a href="http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-to-get-information-about-all-databas">How to get information about all databases without a loop</a>

<a href="http://www.cnblogs.com/smfish007bin/archive/2008/10/16/1312786.html">關于quotename的用法</a>

<a href="http://www.cnblogs.com/gaizai/archive/2013/05/07/3064489.html">SQL Server 遊标運用:檢視一個資料庫所有表大小資訊(Sizes of All Tables in a Database)</a>