SSDT SQL Server调试不会命中CLR断点

Bug*_*boy 10 c# sqlclr user-defined-functions visual-studio-2012 sql-server-data-tools

我将SQL Server数据工具补丁应用于Visual Studio 2012(Premium)并在C#中创建了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

...并执行它,返回47的预期结果.

如果我现在在我的CLR UDF C#代码中的可执行行上放置一个断点,右键单击SQL Server对象资源管理器中的UDF函数,这次选择"调试函数...",我在生成的调试器中登陆SQL测试脚本.我可以将SQL语句单步执行到脚本的末尾,这会返回正确的结果,但是C#代码中的断点永远不会在C#调试器中到达.

该功能的术语似乎具有误导性.对于任何程序员来说,"调试"一个函数意味着逐步执行函数本身的代码中的可执行行.只需生成一个调用我的编译函数并获取结果的SQL测试工具,就是"测试"该函数.最多只有"调试"的是工具生成的测试本身,因为你不能"进入"CLR代码.唯一的选择是"跳过"它.

那么如何让Visual Studio实际调试,并在我的UDF C#代码中点击断点?

Bug*_*boy 8

好的,我终于弄明白了.要在VS 2012中调试SQL CLR代码:

  1. 创建一个调用UDF,sproc或其他CLR对象的SQL测试脚本.(您可以使用服务器对象资源管理器中的"执行功能"或"调试功能"选项来执行此操作,如问题中所述.)

  2. 保存生成的脚本.(默认情况下,它会被称为"SQLQuery1.sql".您可能希望给它一个更有意义的名称.)

  3. 在解决方案资源管理器中,右键单击UDF(或其他CLR类型)项目,然后选择"属性".

  4. 项目的属性选项卡将打开.在左侧,选择"调试"类别.

  5. 在"调试"面板的"启动操作"子类别中,选择"启动脚本:"单选按钮.这将启用关联的下拉列表,以便您可以指定在步骤1中创建的.sql脚本.

  6. 保存所有内容,在C#或其他.NET语言代码的可执行行上切换断点,然后按调试按钮.

注意:您现在可能会收到一个对话框,告诉您" Windows防火墙已阻止此程序的某些功能 ".我选中了这些框以允许访问域和专用网络.

现在继续进行应该会导致达到断点.

  • 请注意:在SQL Server对象资源管理器窗格中右键单击服务器并选择"允许SQL/CLR调试"也很重要! (5认同)
  • 另请注意:如下所述,您应该在管理员模式下运行 Visual Studio。 (2认同)

Con*_*ngo 5

对于Visual Studio 2015+ Update 2:

SQL Server Object资源管理器窗格中,右键单击服务器并选择"允许SQL/CLR调试":

在此输入图像描述

Server Explorer,右键单击要调试的函数,然后选择Execute:

在此输入图像描述

它会为您生成代码.选择Execute with Debugger:

在此输入图像描述

然后,您可以在C#代码中放置一个断点,它会触发它.

它会要求在防火墙中打开一个端口,它会要求附加到SQL Server.