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