我应用了 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 代码:
创建调用 UDF、sproc 或其他 CLR 对象的 SQL 测试脚本。 (您可以通过使用“执行功能”或“调试功能”选项在 服务器对象资源管理器,如问题中所述。)
保存生成的脚本。 (它将被称为类似 默认为“SQLQuery1.sql”。你不妨给它更多 有意义的名字。)
在解决方案资源管理器中,右键单击 UDF(或其他 CLR 类型) 项目,然后选择“属性”。
项目的属性选项卡将打开。在左侧,选择 “调试”类别。
在“调试”面板的“启动操作”子类别中,选择“启动脚本:” 单选按钮。这将启用相关的下拉菜单,以便 您可以指定在步骤 1 中创建的 .sql 脚本。
全部保存,在 C# 或其他 .NET 语言的可执行行上切换断点 代码,然后按调试按钮。
注意:您现在可能会看到一个对话框,告诉您“Windows 防火墙已阻止该程序的某些功能。”我选中了允许访问域和专用网络的框。
现在继续应该会到达您的断点。
关于c# - SSDT SQL Server 调试不会命中 CLR 断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19667890/