【问题标题】:Return Uniqueidentifier from CLR Function从 CLR 函数返回唯一标识符
【发布时间】: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


【解决方案1】:

SQL Server 唯一标识符返回无法显式转换为 Guid .NET 数据类型的二进制结构。

请参阅此处http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ab55037d-6c62-405d-8cac-9e902d867b78,解决方案是将其转换为 byte[](它实际上是什么)并从中创建一个新的 Guid。

Guid g = new Guid(cmd.ExecuteScalar() as byte[]);

当然,你需要测试cmd.ExecuteScalar()是否为null,然后创建Guid.Empty。

我假设您的 T-SQL 代码仅用于演示目的,而您正在使用其他目的生成 GUID。另一方面,如果您只需要 SQL Server 中的唯一 GUID,则可以使用 NEWID() 内置函数。

select NEWID()

【讨论】:

  • 是的。 T-SQL 仅用于演示目的。谢谢您的回答。这是有道理的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2014-03-05
  • 2012-06-02
相关资源
最近更新 更多