【发布时间】:2013-04-22 22:21:16
【问题描述】:
我正在为 SQL Server 2008 R2 创建一个 CLR 函数。 CLR 函数返回一个uniqueidentifier,有时可以是null。它在返回值为 not null 时起作用。但是,当返回 null 值时,SQL Server 会抛出错误 Specified cast is not valid.
函数在数据库中注册:
create function MyFunc returns uniqueidentifier as external name AssemblyName.UserDefinedFunctions.MyFunc
示例代码
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static Guid MyFunc()
{
using (SqlConnection con = new SqlConnection("context connection=true"))
{
con.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = con;
cmd.CommandText = "select cast('00000000-0000-0000-0000-000000000000' as uniqueidentifier)";
//cmd.CommandText = "select cast(null as uniqueidentifier)";
return (Guid)cmd.ExecuteScalar();
}
}
}
第一个CommandText 有效,第二个抛出Specified cast is not valid 错误。
我尝试在第 2 行和第 12 行将返回类型从 Guid 更改为 SqlGuid,但是 SQL Server 总是抛出 Specified cast is not valid 错误,无论该值是否为 null。
问题
当返回值有时是 null 时,从 CLR 函数返回 uniqueidentifier 的正确方法是什么?
【问题讨论】:
-
请问你为什么要去CLR执行T-SQL?
-
@AaronBertrand - 对于这个特定项目,我们已将尽可能多的 T-SQL 放入 CLR DLL 中。如果需要,我们可以使用 T-SQL 函数。这就是你的建议吗?可以用 CLR 完成吗?
-
将 T-SQL 放入 CLR 似乎很奇怪,尤其是“尽可能”...
-
@AaronBertrand - 我们有几十个使用 SQL 的数据库,并且有一种在数据库中重新注册 CLR DLL 的自动方法。因此部署 CLR 代码毫不费力。我们还没有搭建好T-SQL代码的部署系统……
-
所有数据库都在同一台服务器上吗?如果是这样,为什么不使用集中式功能而不是每个数据库一个呢?您还应该知道,在 CLR 中执行的大多数 T-SQL 功能(例如数据访问)实际上比不通过 CLR 的相同操作效率低。您引用的便利性是否超过性能,耸耸肩,但如果性能是一个问题,您应该对其进行测试。
标签: sql-server function sql-server-2008-r2 clr