SQLのデータベースにいくつかの.net関数を公開している古いソリューションに立ち向かっています。しかし、新しいデータベースに公開しようとする試みは、日付を操作する関数では失敗しています。SQL CLRデータベースを公開しようとする日時型の不一致
失敗の機能は次のとおりです。
[SqlFunction(TableDefinition="localtime datetime2", IsDeterministic=true, IsPrecise=true,
DataAccess=DataAccessKind.None,
SystemDataAccess=SystemDataAccessKind.None)]
public static DateTime ConvertFromUTC(DateTime utctime, string timezoneid)
{
if (utctime.Kind == DateTimeKind.Unspecified)
utctime = DateTime.SpecifyKind(utctime, DateTimeKind.Utc);
utctime = utctime.ToUniversalTime();
return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utctime, timezoneid);
}
公開しようとしたときに、私が取得エラーメッセージは次のとおりです。
[DBO]の作成[ConvertFromUTC] ...
( 268,1):SQL72014:.Net SqlClientデータプロバイダ:
メッセージ6551、レベル16、状態2、手順ConvertFromUTC、行1
戻り値のT-SQL型とCLR型が一致しないため、「ConvertFromUTC」のCREATE FUNCTIONが失敗しました。(268,0):機能のバージョンの
CREATE FUNCTION [dbo].[ConvertFromUTC] (@utctime DATETIME, @timezoneid NVARCHAR (MAX)) RETURNS TABLE ([localtime] DATETIME2 (7) NULL) AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC]
SQL定義:SQL72045:機能を追加するための試みで、.NETから生成されたスクリプトの実行エラー
SQL
CREATE FUNCTION [dbo].[ConvertFromUTC]
(@utctime [datetime], @timezoneid [nvarchar](4000))
RETURNS [datetime] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC]
@ Mattの回答に記載されている提案に加えて、次の点も考慮する必要があります。属性から 'TableDefinition =" localtime datetime2 "、'を削除してください。 'timezoneid'に' string'の代わりに 'SqlString'を使います(' return'の 'timezoneid'を' timezoneid.Value'に変更する必要があります)。 '@timezoneid'を' NVARCHAR(MAX) 'からNVARCHAR(50)に変更するか、または' MAX'ではないサイズに変更してください。また、 'TimeZoneInfo'クラスにメモリリークがあることに注意してください。なぜなら、アセンブリに' UNSAFE'とマークする必要があるからです。 –
一般的なSQLCLRの使用の詳細については、SQL Server Centralの[Stairway To SQLCLR](http://www.sqlservercentral.com/stairway/105855/)(無料登録彼らのコンテンツを読む必要がありますが、それは価値があります)。 –
@srutzky - ['HostProtectionAttribute.MayLeakOnAbort'](https://msdn.microsoft.com/en-us/library/system.security.permissions.hostprotectionattribute.mayleakonabort.aspx)は、「メモリリークがある」という意味ではありません。 –