11

我将SQL Server Data Tools 补丁应用到 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;
    }
}

在 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# 代码中命中断点?

4

4 回答 4

9

好吧,我终于想通了。在 VS 2012 中调试 SQL CLR 代码:

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

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

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

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

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

  6. 全部保存,在 C# 或其他 .NET 语言代码的可执行行上切换断点,然后按下调试按钮。

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

现在继续应该会导致您的断点到达。

于 2013-11-08T16:51:41.403 回答
6

对于Visual Studio 2015+ Update 2

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

在此处输入图像描述

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

在此处输入图像描述

它将为您生成代码。选择Execute with Debugger

在此处输入图像描述

然后,您可以在您的 C# 代码中放置一个断点,它会命中它。

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

于 2016-04-03T22:08:38.130 回答
2

I do not know if SSDT changes this, but in VS2008 I debug a .net UDF as follows:

  • I deploy it to my local SQL server,
  • then I attach VS to the SQL Server process (Menu Debug/Attach to process/sqlserver.exe, if SQL Server is running as a service it requires that VS was started as administrator).
  • Then execute some SQL code calling the UDF, e. g. in Management Studio. Maybe this will work from SSDT in VS 2012.
于 2013-11-06T23:55:57.447 回答
1

您应用的补丁可能会安装 Visual Studio Quarterly 更新中不最新的 VS 项目。我建议您现在为 VS 2012 应用最新的Visual Studio 季度更新

于 2013-11-07T00:06:57.293 回答