下面的圖表顯示了當許多存儲過程從一個Microsoft SQL Server版本移入另一個版本時,引入了新的存儲過程,而原來的一些則從安裝包裡刪除了。大多數的存儲過程,如果不是所有的,要求用戶是系統管理員服務器角色以便執行這些存儲過程。和文件系統交互的存儲過程還要求執行存儲過程的用戶(還有SQL Server的服務帳戶)具有訪問文件/文件夾的權限。
存儲過程名稱 SQL 2000 SQL 2005 SQL 2008 sp_executeresultset X sp_MSforeachdb X X X sp_MSforeachtable X X X sp_readerrorlog X X X xp_create_subdir X X Xp_delete_file X X xp_dirtree X X X xp_fileexist X X X xp_fixeddrives X X X xp_getfiledetails X xp_getnetname X X X xp_loginconfig X
X X xp_makecab X xp_msver X X X xp_get_mapi_profiles X X X xp_subdirs X X X xp_test_mapi_profile X X X xp_unpackcab X
sp_executeresultset
微軟在SQL Server 2005中刪除了這個名為sp_executeresultset的便利小程序。它允許你在空閒時通過使用SELECT查詢產生動態SQL代碼。然後,作為結果的SQL命令將會在數據庫上執行。它允許你創建單獨的一行代碼,這行代碼可以在單步中查詢到你的數據庫裡的每一個表的記錄數目(就像例子中所顯示的)。這是一個未公開的存儲過程,而且無法知道它為什麼被刪除了。但是,唉,這個便利的有用存儲過程已經沒有了。
exec sp_execresultset 'SELECT ''SELECT '''''' + name + '''''',
count(*) FROM '' + name
from sysobjects
where xtype = ''U'''
sp_MSforeachdb / sp_MSforeachtable
sp_MSforeachdb / sp_MSforeachtable
兩個存儲過程,sp_MSforeachdb和sp_MSforeachtable封裝了一個指針。它們允許你對你的SQL Server上的每一個數據庫和當前數據庫中的每一個表分別執行T-SQL代碼。然而你不能在SQL2000和之前的版本中在一個sp_MSforeachdb命令中使用sp_MSforeachtable命令。在這些存儲過程中使用的指針名稱是一樣的(hCForEach),因此在每一次執行sp_MSforeachtable時會返回一個錯誤說該指針名稱已經在使用。在SQL Server 2005中,微軟解決了這一問題。為了執行“下一個”命令,你必須告訴其中的一個存儲過程它將使用一個不同的替換字符而不是默認的問號。我改變了數據庫命令中的這個替換字符,因為它更為簡單。
打印當前數據庫中的每一個表的名稱
exec sp_MSforeachtable 'print ''?'''
打印當前服務器的每一個數據庫
exec sp_MSforeachdb 'print ''?'''
打印當前數據庫的每一個表
exec sp_MSforeachdb 'use [@] exec sp_MSforeachtable ''print
''''@.?''''''', '@'
sp_readerrorlog / xp_readerrorlog
存儲過程sp_readerrorlog實際上有兩種形式。每一項的工作內容一樣;一個是另一個的簡單封裝。封裝的存儲過程是sp_readerrorlog,它調用xp_readerrorlog。這兩個都有四個輸入參數,但是只有前兩個對我們有用。第一個參數設定你希望看到的文件編號。第二個是要查看的日志(對於ERRORLOG是1或空,對SQL Agent Log是2)。這允許你快速並很容易地查看你的錯誤日志,而不是得查看SQL Server 2005和SQL 2008所帶來的臃腫的日志閱覽器。
查看當前的SQL ERRORLOG文件。
exec sp_readerrorlog
exec sp_readerrorlog 0, 1
查看之前的SQL Agent Log文件。
exec sp_readerrorlog 1, 2
xp_create_subdir
在SQL Server 2005中引入的xp_create_subdir存儲過程是非常輕便的,因為你可以用它在SQL Server的硬盤上或從T-SQL內部的網絡共享上創建文件夾。
exec xp_create_subdir 'c:\MSSQL\Data'
xp_delete_file
使用SQL Server 2005中引入的xp_delete_file存儲過程從SQL Server的硬盤或從T-SQL內部的網絡共享上刪除文件。
xp_dirtree
xp_dirtree存儲過程允許你查看文件夾樹狀結構和/或一個文件夾下的文件列表。這個存儲過程有幾個參數用來控制這個存儲過程查詢深度和是返回文件和文件夾還是只返回文件夾。第一個參數設定要查看的文件夾。(建議;不要在Windows的系統盤根目錄上執行這個存儲過程,因為產生樹和返回數據需要一些時間。)第二個參數限制了這個存儲過程將會進行的遞歸級數。默認是零或所有級別。第三個參數告訴存儲過程包括文件。默認是零或只對文件 夾,數值1代表包括結果集的文件。定義第三個參數為不為零的數值將會增加一行到輸出的調用文件,這個文件是顯示進入一個文件夾或文件的一個小文件。
獲得完整目錄樹。
exec xp_dirtree 'd:\mssql\'
獲得目錄樹的前兩級。
exec xp_dirtree 'd:\mssql\', 2
獲得目錄數的前三級,包括文件。
exec xp_dirtree 'd:\mssql\', 3, 1
exec xp_dirtree 'd:\mssql\'
xp_fileexist
這個SQL Server存儲過程,xp_fileexist,是用來決定一個文件是存在於的硬盤上還是在網絡共享上。它對於從規則文檔中下載數據的存儲過程是非常有用的。它允許你在打算盲目的下載數據之前查看文件是否存在。這個存儲過程有兩個參數。用第一個參數來確定你想要的文件或文件夾是否存在。第二個參數是一個輸出參數,如果它被定義了,會根據文件存在或不存在而返回1或0。
沒有這個參數:
exec xp_fileexist 'c:\importfile.csv'
有這個參數:
DECLARE @file_exists int
exec xp_fileexist 'c:\importfile.csv', @file_exists OUTPUT
SELECT @file_exists
xp_fixeddrives
xp_fixeddrives存儲過程是最有用的存儲過程之一。它展示了一個列表所有驅動器名和每個驅動器上的空閒空間大小。這個參數有一個單獨的可選輸入參數,它可以按驅動器類型過濾結果。設置為數值3將會返回所有的大量存儲設備(CD-ROM,DVD等等);設置為數值4將會返回硬盤驅動器;而當設置為數值2時將會返回可移動的設備(USB插拔驅動器,閃存驅動器等等)。
返回所有的驅動器。
exec xp_fixeddrives
只返回硬盤驅動器
exec xp_fixeddrives 2
xp_getfiledetails
xp_getfiledetails是另一個非常有用的存儲過程,在SQL Server 2000版本中最後一次可用。這個存儲過程返回關於指定文件的大小、日期和屬性信息,包括創建、訪問和修改的日期和次數。
exec xp_getfiledetails 'c:\filetoload.csv'
xp_getnetname
xp_getnetname存儲過程返回Microsoft SQL Server安裝所在的物理機器的名稱。你可以使機器名稱作為數據集返回或作為變量返回。
沒有這個參數
exec xp_getnetname
使用這個參數
DECLARE @Machinename sysname
exec xp_getnetname @Machinename OUTPUT
select @Machinename
xp_loginconfig
SQL Server存儲過程將會告訴你關於執行它的用戶的一些基礎的校驗信息。它告訴你校驗方法(Windows或SQL登錄)、服務器的默認域、審計級別,還有一些內部分隔符信息。
exec xp_loginconfig
xp_makecab
在SQL Server 2000中,微軟給了我們直接從T-SQL壓縮系統文件的能力,不必再到DOS下通過xp_cmdshell和運行第三方軟件,像pkzip或winzip來完成。這個命令就是xp_makecab。它允許你指定一列你想壓縮的文件還有你想放進去的cab文件。它甚至允許你選擇默認壓縮,MSZIP壓縮(類似於.zip文件格式)或不壓縮。第一個參數給出到cab文件的路徑,這是你想創建和添加文件的地方。第二個參數是壓縮級別。如果你想使用詳細的日志記錄就使用第三個參數。第四個參數後跟著你想壓縮的文件的名稱。在我的測試裡,我可以在擴展存儲過程裡傳45個要壓縮的文件名稱,這意味著它是一個對你的數據壓縮要求來說非常靈活的解決方案。
exec xp_makecab 'c:\test.cab', 'mszip', 1, 'c:\test.txt' , 'c:\test1.txt'
xp_msver
存儲過程xp_msver在查看系統信息的時候是非常有用的。它返回關於主機操作系統的大量的信息——SQL版本號、語言、CPU類型、版權和商標信息、Microsoft Windows版本、CPU數和親和性設置、物理內存設置和你的產品鍵。這個存儲過程有許多輸入參數,它們允許你過濾返回的記錄。每一個參數都是一個sysname數據類型,它接受一條記錄的名稱。如果指定了所有的參數,那麼只有指定的行作為參數返回。
沒有指定過濾。
exec xp_msver
只返回Platform和Comments記錄。
exec xp_msver 'Platform', 'Comments'
xp_get_mapi_profiles
xp_get_mapi_profiles存儲過程幫助你配置SQL Mail。執行時,它會通過SQL Server 的SQL Mail組件調用Windows,並且顯示在Outlook中配置的可用的MAPI概要列表,並且它指定哪個概要是默認的概要。如果它不顯示任何記錄,那麼或者是Outlook沒有配置正確,或者是配置了Outlook概要但SQL Server沒有運行在一個域帳戶下。為了在SQL Server 2005或SQL Server 2008中使用這個存儲過程,你必須在Surface Area Configuration(外圍應用配置器)工具或sp_configure存儲過程中設置“SQL Mail XPs”選項為可用。
exec xp_get_mapi_profiles
xp_subdirs
xp_subdirs存儲過程顯示通過xp_dirtree可用的信息的子集。xp_subdirs將會顯示給定的文件夾的所有的子文件夾。當你在一個表裡動態地構建一個目錄樹時它是很便利的,並且你不需要擔心xp_dirtree存儲過程的其它參數。
exec xp_subdirs 'd:\mssql'
xp_test_mapi_profiles
xp_test_mapi_profiles存儲過程是另一個未公開的存儲過程,它在你建立SQL Mail時非常有用。它會啟動然後停止一個MAPI會話來確保MAPI配置正確並工作在Microsoft SQL Server之內。我應該指出,它不校驗MAPI客戶端(Outlook)中的郵件服務器配置,也不發送測試信息。
存儲過程接受一個單獨的輸入參數。這個參數是你要測試的MAPI概要的名稱。就像xp_get_mapi_profiles存儲過程一樣,這個存儲過程要運行在SQL Server 2005和SQL Server 2008之中,你必須在Surface Area Configuration(外圍應用配置器)工具或sp_configure存儲過程中設置“SQL Mail XPs”選項為可用。
當使用SQL Mail存儲過程時,要清楚SQL Mail仍預計要從Microsoft SQL Server平台中刪除。這意味著sp_get_mapi_profiles和xp_test_mapi_profiles存儲過程是預計要刪除的,因為他們是SQL Mail子系統的一部分。你應該在SQL Server 2005中做所有的郵件工作,然後使用Database Mail替代SQL Mail來確保代碼可移植到SQL Server的未來版本中。微軟最初計劃在SQL Server 2008中刪除SQL Mail,但基於其包括在了當前的測試版本中,它未來是否存在於SQL Server 2008中還是未知數。
xp_unpackcab
隨xp_makecab存儲過程而來的xp_unpackcab擴展存儲過程,它能做的就像它的名字一樣:從cab文件提取文件。第一個參數是cab文件,第二個參數是你想提取到的路徑,第三個參數是詳細記錄日志。第四個參數使你可以指定“提取到”的文件名稱。
exec xp_unpackcab 'c:\test.cab', 'c:\temp\', 1
雖然這並不打算羅列SQL Server中未公開的存儲過程的完整列表,但它確實持著使SQL Server管理員的工作容易些的期望提供了一個對許多未公開的存儲過程的參考。記住,你絕不應該指望從一個SQL Server版本到另一個版本時這些存儲過程仍然存在,你也不應該期待在不同的版本間它們的代碼基礎仍然相同。意思就是,去編碼並享受它帶來的便利。
所有提供的關於Microsoft SQL Server 2008(Katmai)的信息是基於該軟件的測試版10.0.1019。