2013-10-29 547 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