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

标签 c# visual-studio-2012 user-defined-functions sqlclr sql-server-data-tools

我应用了 SQL Server Data Tools patch到 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 对象资源管理器 Pane 中,我右键单击新发布的 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# 代码中命中断点?

最佳答案

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

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

  2. 保存生成的脚本。 (它将被称为类似 默认为“SQLQuery1.sql”。你不妨给它更多 有意义的名字。)

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

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

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

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

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

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

关于c# - SSDT SQL Server 调试不会命中 CLR 断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19667890/

相关文章:

vba - Excel自动计算设置

scala - 合并 Spark 数据框中的列

c# - 字母数字小写和 "-",

c# - 动态关键字 C# 4.0

Visual Studio 2012 中的 Javascript 关键字颜色

c# - Timepicker 不显示旁边的箭头

c# - GraphQL 为 .net 开发做好准备

c# - epplus 部分已经存在

c#-4.0 - 尝试从 VS 2012 发布网站时,导致 NormalizeServiceUrl 和 Missing or Invalid property 错误的原因是什么

sql - 函数不返回预期值