SQL Server 2008、Visual Studio 2005、.net 2.0 SP2 を使用 (新しい SQL Server 2008 データ型をサポート)。
入力として DateTime2 を受け取り、別の DateTime2 を返す SQLCLR 関数を作成しようとしています。例:
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace MyCompany.SQLCLR
{
public class DateTimeHelpCLR
{
[SqlFunction(DataAccess = DataAccessKind.None)]
public static SqlDateTime UTCToLocalDT(SqlDateTime val)
{
if (val.IsNull)
return SqlDateTime.Null;
TimeZone tz = System.TimeZone.CurrentTimeZone;
DateTime res = tz.ToLocalTime(val.Value);
return new SqlDateTime(res);
}
}
}
これで、上記は正常にコンパイルされます。これらの SqlDateTimes を SQL Server の DateTime2 にマップしたいので、この T-SQL を実行してみます。
CREATE function hubg.f_UTCToLocalDT
(
@dt DATETIME2
)
returns DATETIME2
AS
EXTERNAL NAME [SQLCLR].[MyCompany.SQLCLR.DateTimeHelpCLR].UTCToLocalDT
GO
これにより、次のエラーが発生します。
メッセージ 6551、レベル 16、状態 2、プロシージャ f_UTCToLocalDT、行 1 "f_UTCToLocalDT" の CREATE FUNCTION は、戻り値の T-SQL と CLR の型が一致しないため失敗しました。
(DATETIME2 の代わりに) DATETIME を使用すると問題なく動作します。しかし、精度の向上をサポートするには、むしろ DATETIME2 を使用したいと思います。私は何か間違ったことをしていますか、それとも DateTime2 は SQLCLR で (完全に) サポートされていませんか?