SQL Server未公開的兩個儲存過程

2022-03-07 09:05:57 字數 1451 閱讀 9920

sp_msforeachtable和sp_msforeachdb是sql server的兩個系統儲存過程,存在於master資料庫當中,但是在sql server的聯機幫助中並沒有這兩個儲存過程,也就是說微軟並沒有把這兩個儲存過程編進sql server的聯機叢書中。那麼microsoft設計這兩個系統儲存過程的目的到底是什麼呢?這兩個系統儲存過程又能幹些什麼呢?實際上microsoft設計這兩個系統儲存過程的目的是要支援編寫一種單一的sql語句,該語句可以在當前伺服器的所有資料庫上或當前資料庫的所有表上執行相同的動作。下面介紹這兩個儲存過程。

首先看下這條sql語句:exec sp_msforeachdb @command1 = 「print 『?』」 ,該sql語句從當前伺服器中取得所有的資料庫名稱。 如圖:

@command1引數用於指定儲存過程將在每個資料庫上執行的動作。這裡使用問號代替了資料庫名稱,該儲存過程最多可以指定三個命令(使用@command2 、@command3)。在後台,這個儲存過程將在sysdatabases表中為每一條記錄開啟乙個游標,然後動態組裝乙個將通過迴圈在每條記錄上執行的批處理。這條語句將顯示每個資料庫中的使用者表的數目:exec sp_msforeachdb @command1 = "select count(name) from ?.dbo.sysobjects where xtype='u'",執行結果如圖:

下面的命令建立了乙個有關每個資料庫空間使用情況的報告:exec sp_msforeachdb @command1 = "use ? exec sp_spaceused",執行結果如圖:

還可以在當前資料庫的所有表上執行sp_spaceused過程:exec sp_msforeachtable @command1 = "sp_spaceused '?'",你也可以在每乙個表上得到一些記錄:exec sp_msforeachtable @command1 = "print '?'",@command2 = "select count(*) from ?",執行結果並沒有按照所希望的順序排列,如果你想按照表名對它進行排列,必須使用@whereand引數:exec sp_msforeachtable @command1 = "exec sp_spaceused '?'",@whereand = " order by name",這個引數本來是用來新增where子查詢用的,但是因為查詢時動態的組裝的,所以你可以借用一下來加入乙個order by子句。

再給你偷乙個小竅門,也就是如果乙個命令在迴圈之前或之後只應該執行一次,那麼你可以使用@precommand或@postcommand引數;還有你也還可以使用@replacechar引數來為資料庫名稱和表名指定不同的佔位符,這個引數在命令需要使用問號時十分有用,例如,like子句中的萬用字元等。

以前,在檢查所有資料庫的容量;看看指定資料庫所有使用者表的容量,所有表的記錄數等工作時需要寫一些游標來完成這些工作,不但費勁費時,而且游標的效率也不高,好了,有了這兩個儲存過程,你就可以輕而易舉的完成這些工作了。大家感興趣的話,可以去看看這兩個儲存過程的源**,這裡就不再把它貼出來了。

兩個未公開的ACCESS方法的使用技巧

應黃海之邀 突然要寫點自己的東西,一下子彷彿不知道寫些什麼了,研究access這麼多年,感覺都是在做企業應用,並沒有什麼高深的技巧,也沒有屬於自己的技巧,只好絞盡腦汁,榨點東西出來,希望能對得起黃海和大家 用途1 用途2 可以將窗體儲存到文字檔案,然後把文字檔案儲存到ole欄位裡,這樣整個窗體的介面...

未公開的SQL Server口令的加密函式

未公開的sql server口令的加密函式 如果對mssql的使用者資訊有興趣的,可能會發現master.dbo.sysxlogins裡面存放著使用者的口令,可是呢,password欄位如果不是null就是一堆看不懂的binary,這個口令是怎麼加密的呢?其實只要仔細看看master.dbo.sp ...

未公開的SQL Server口令的加密函式

如果對mssql的使用者資訊有興趣的,可能會發現master.dbo.sysxlogins裡面存放著使用者的口令,可是呢,password欄位如果不是null就是一堆看不懂的binary,這個口令是怎麼加密的呢?其實只要仔細看看master.dbo.sp addlogin就知道了,mssql的sp都...