1

我正在为 SQL Server 2008 R2 创建一个 CLR 函数。CLR 函数返回一个uniqueidentifier,有时可能是null。它在返回值不是 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错误。

Guid我尝试在第 2 行和第 12行将返回类型从更改为SqlGuid,但是 SQL Server 总是抛出Specified cast is not valid错误,无论该值是否null

问题

uniqueidentifier当返回值有时是时,从 CLR 函数返回 a 的正确方法是null什么?

4

1 回答 1

0

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

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

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

当然,您需要测试是否cmd.ExecuteScalar()为 null 并创建 Guid.Empty 代替。

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

select NEWID()
于 2013-04-22T22:58:12.310 回答