2013-10-29 176 views
10

我申請SQL Server Data Tools patch到Visual Studio 2012(專業版),創造了在C#中的SQL Server CLR用戶定義函數項目:SSDT SQL Server調試不打CLR斷點

public partial class UserDefinedFunctions 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlInt32 Add42(SqlInt32 in_param) 
    { 
     SqlInt32 retval = in_param + 42; // Set break point here. 
     return retval; 
    } 
} 

在SQL Server對象資源管理器窗格中,右鍵單擊新發布的UDF並選擇「執行函數...」。系統提示我提供示例輸入值,然後Visual Studio再將函數(再次)發佈到本地2012 SQL Server並生成腳本,看起來像這樣:

DECLARE @return_value Int 

EXEC @return_value = [dbo].[Add42] @in_param = 5 

SELECT @return_value as 'Return Value' 

GO 

...並執行它,返回47的預期結果。

如果我現在在CLR UDF C#代碼的可執行行上放置一個斷點,請右鍵單擊SQL Server對象資源管理器中的UDF函數,然後選擇「調試功能...「,我登陸調試器爲生成的SQL測試腳本。我可以逐句通過SQL語句到腳本的末尾,該腳本返回正確的結果,但C#代碼中的斷點永遠不會在C#調試器中達到。

此功能的術語似乎具有誤導性。對於任何程序員來說,「調試」一個函數意味着在函數本身的代碼中逐步執行可執行的行。簡單地生成一個調用我的編譯函數並返回結果的SQL測試工具就是「測試」函數。至多,「調試」唯一的東西是工具生成的測試本身,因爲你不能「步入」CLR代碼。唯一的選擇是「跨越」它。

那麼,如何讓Visual Studio來實際調試,在我的UDF的C#代碼命中斷點?

+0

您是否試過單步執行[此MSDN文檔](http://technet.microsoft.com/zh-cn/library/ms131096.aspx)的步驟以查看是否跳過了一個步驟? –

+0

@Scott - 我試過了,但是在告訴你如何創建一個SQL CLR函數或sproc--我已經明顯已經完成了 - 所有那篇文章給你的是Visual Studio調試101.你知道:「右鍵單擊一行然後選擇「添加測試類型的腳本」:「在解決方案資源管理器中,展開TestScripts目錄並雙擊Test.sql」我看不到「TestScripts」目錄在2012年或2010年的解決方案資源管理器,所以我不知道他們在說什麼。 – Buggieboy

回答

7

好吧,我終於明白了這一點。要在VS 2012調試SQL CLR代碼:

  1. 創建一個SQL測試腳本調用UDF,存儲過程或其他CLR對象。 (您可以通過使用 服務器對象資源管理器「執行功能」或「調試功能」選項,在問題中所述做到這一點。)

  2. 保存生成的腳本。 (默認情況下,它將被稱爲 「SQLQuery1.sql」,您可能希望給它更多 有意義的名稱。)

  3. 在解決方案資源管理器中,右鍵單擊UDF(或其他CLR類型) 項目,然後選擇「屬性」。

  4. 項目的屬性選項卡將打開。在左側,選擇 「調試」類別。

  5. 在調試面板的「開始操作」子類別中,選擇「啓動腳本:」 單選按鈕。這將使相關的下拉,這樣 您可以指定步驟創建的.sql腳本1.

  6. 全部保存,撥動你的C#或其他.NET語言 代碼的可執行行設置斷點,然後按調試按鈕。

注意:您現在可以得到一個對話框,告訴你說:「Windows防火牆阻止該程序的某些功能。」我檢查了這些框以允許訪問域和專用網絡。

現在進行應該會導致您的斷點。

+5

請注意:在SQL Server對象資源管理器窗格中,右鍵單擊服務器並選擇「允許SQL/CLR調試」也很重要! – Buggieboy

+1

還要注意:如下所述,您應該以管理員模式運行Visual Studio。 – Buggieboy

+0

遵循一切。在數據庫項目屬性或服務器瀏覽器連接窗格中的任何位置都沒有允許SQL/CLR調試選項。 – jwize

2

我不知道SSDT改變這一點,但在VS2008我調試.NET UDF如下:

  • 我把它部署到我本地的SQL服務器,
  • 然後附上VS到SQL服務器進程(菜單調試/附加到進程/ sqlserver.exe,如果SQL Server作爲服務運行,它需要VS以管理員身份啓動)。
  • 然後執行一些調用UDF的SQL代碼, G。在管理工作室。也許這將從VS 2012中的SSDT起作用。
+0

弗蘭克,明確附加在VS 2012中是沒有必要的。看我上面的答案。 – Buggieboy

1

您應用的修補程序可能會安裝Visual Studio季度更新中未包含的VS項目。我建議你現在應用最新的Visual Studio Quarterly Update VS 2012.

+0

這是一個很好的建議,我跟着它並在我的SSDT補丁上應用了季度更新,但它並沒有改變調試行爲或解決方案資源管理器的目錄結構 – Buggieboy

+1

@Buggieboy我正在開發Windows Phone應用程序並安裝了Azure插件,然後我的WP8模擬器wo因爲Azure在我之前安裝的補丁中安裝了VS中的組件,所以未出現。很高興你解決了。 – OmegaMan

5

對於Visual Studio 2015 + Update 2

SQL Server Object瀏覽器面板,在服務器上單擊鼠標右鍵,選擇 「允許SQL/CLR調試」:

enter image description here

Server Explorer,右鍵點擊功能要調試,並選擇Execute

enter image description here

它會爲您生成代碼。選擇Execute with Debugger

enter image description here

然後,您可以放置​​一個斷點在你的C#代碼,它會擊中它。

它會要求在防火牆中打開一個端口,它會要求附加到SQL Server

+0

這些步驟是正確的。但是我在調​​試時仍然出現錯誤。提示是以提升模式啓動VS 2015(即以管理員身份運行),這解決了我的問題(我當前的環境是Windows 10 Pro + VS 2015 Update 3) – jyao