今天突然有同事問起,如何在sqlserver中調試預存程序(我們公司使用的是sqlserver 2008 R2),猛地一看,和以前使用sqlserver 2000真的有很大的不同,我真暈了。
於是琢磨了一下。SQLSERVER 2005中不知因何去掉了很重要的DEBUGGER功能,要調試,必須要安裝VS2005專業版或者更高版本。非常不方便。
還好,SQLSERVER 2008中這個很重要而且方便的功能又回來了。
不過,SQLSERVER 2008的調試功能和SQL2000的方法差別很大。SQL2000是在查詢分析器中的物件瀏覽器中選中需要調試的預存程序,右鍵----調試---輸入參數開始調試。
sqlserver2008中則完全不同,變成了必須要在SSMS中EXEC [PROCEDURE NAME] @VAR1,@VAR2,然後點綠色三角或者點菜單中的調試---啟動調試。然後點工具列的最右邊的單步調試或者跳出等。下面的變數視窗和堆棧視窗等可以查看調試中變數等動態變化值。
sqlserver2008調試的要求和條件:如果在引擎所在的電腦或伺服器上調試,則只需要SA或者WINDOWS使用者登陸即可。如果是異地調試,則需要設定防火牆例外,增加SSMS和SQLSERVER.EXE為允許,增加135連接埠允許通過。
總之,SQL2008的調試比2000操作起來麻煩多了,要求也多了。剛開始感覺不如2000的好用,也可能是使用2000習慣了。習慣是可怕的,但是微軟是在不斷進步的...
一、回顧早期的SQL SERVER版本:
早在SQL Server 2000時代,查詢分析器的功能還很簡陋,遠不如VS那麼強大。到SQL Server 2005時代,代碼高亮、SQL最佳化等功能逐漸加強,但是依然無法調試SQL語句。好一點的第三方的SQL文法編輯器似乎也不夠完美,這樣導致一些人抱怨預存程序不便於維護,開發的時候能不用則不用。
二、SQL Server 2008 Express 智能提示加強:
該功能是SQL2008在SQL Server 2005之後的升級版,我們可以很方便的調用智能提示,和 VS一致:使用快速鍵ctrl + J 即可。
截圖如下:
該功能是否與VS一樣了呢? 畢竟他們都是微軟的產品。
三、調試T-SQL語句:
1.Debug普通T-SQL語句:
SQL代碼如下:
use northwind go
declare @i int ,@j int,@k int set @i = 1;
set @j = 2; set @k=@i + @j
select @i; go
非常簡單的定義了 三個int 型變數:i、j、k並且對這些變數進行簡單的邏輯運算,在Management Studio 中只要輕鬆的按F11鍵,即可調試以上代碼塊。
截圖如下:
![]()
接著點擊F11逐語句debug 或者F10逐過程調試代碼。
截圖如下:
這個dubug的場面您是否覺得已經和VS相差無幾了呢?
四、支援複雜預存程序嵌套debug:
您可能會疑問,在一個龐大的系統中,如果資料庫邏輯絕大部分都是預存程序實現的情況下,會出現預存程序嵌套預存程序或者嵌套儲存函數這樣的代碼。
SQL2008是否支援調試功能呢?答案是肯定的。
首先定義一個簡單的預存程序(本文使用NorthWind資料庫)代碼如下:
CREATE procedure sp_getOrders @orderID int = null
as if (@orderID is null )
begin print 'null'
end else
begin print 'correct'
end select * from Orders whereOrderID = @orderID
go
該預存程序在以下批處理內被調用,代碼如下:
declare @i int ,@j int,@k int set @i = 1;
set @j = 2; select @k=@i + @j
exec sp_getOrders 10248 select @i;
go
F11對以上代碼進行SQL Debug。
截圖如下:
當斷點經過exec sp_getOrders 10248 這段代碼時,點擊F11進入sp_getOrders預存程序進行逐語句debug。
截圖如下:
這樣可以在嵌套的預存程序或函數內進行debug了,此刻不得不承認: 升級後的SQL2008越來越強大。您還恐懼使用或者調試預存程序嗎?