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は機能し、2 番目はエラーをスローしSpecified cast is not validます。

2行目と12行目で戻り値の型を から に変更しようとしGuidましたが、値がそうであるかどうかに関係なくSqlGuid、SQL Serverは常にエラーをスローします。Specified cast is not validnull

質問

uniqueidentifier戻り値が時々 である場合、CLR 関数から aを返す適切な方法は何nullですか?

4

1 に答える 1

0

GuidSQL Server の uniqueidentifier は、 .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 に答える