【发布时间】:2013-11-09 04:17:27
【问题描述】:
我将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 对象资源管理器窗格中,我右键单击新发布的 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# 代码中命中断点?
【问题讨论】:
-
您是否尝试过单步执行this MSDN document 的步骤,看看您是否跳过了一个步骤?
-
@Scott - 我试过了,但在告诉你如何创建 SQL CLR 函数或存储过程之后 - 我显然已经完成了 - 那篇文章给你的只是 Visual Studio 调试 101。你知道:“右键单击一行并选择“'toggle breakpoint'”等。然后,它说“添加一个测试类型的脚本。”:“在解决方案资源管理器中,展开TestScripts目录并双击Test.sql " 我在 2012 年或 2010 年的解决方案资源管理器中都看不到“TestScripts”目录,所以我不知道他们在说什么。
标签: c# visual-studio-2012 user-defined-functions sqlclr sql-server-data-tools