Incompatibilité de type datetime essayant de publier une database SQL CLR

J'essaie de mettre en place une ancienne solution qui publie un certain nombre de fonctions .net dans une database SQL Server. Mais la tentative de publication vers une nouvelle database échoue sur une fonction qui manipule les dates.

La fonction qui échoue est:

[SqlFunction(TableDefinition="localtime datetime2", IsDeterministic=true, IsPrecise=true, DataAccess=DataAccessKind.None, SystemDataAccess=SystemDataAccessKind.None)] public static DateTime ConvertFromUTC(DateTime utctime, ssortingng timezoneid) { if (utctime.Kind == DateTimeKind.Unspecified) utctime = DateTime.SpecifyKind( utctime, DateTimeKind.Utc ); utctime = utctime.ToUniversalTime(); return TimeZoneInfo.ConvertTimeBySystemTimeZoneId( utctime, timezoneid ); } 

Le message d'erreur que j'obtiens en essayant de publier est:

Création [dbo]. [ConvertFromUTC] …

(268,1): SQL72014: Fournisseur de données SqlClient .Net:

Msg 6551, niveau 16, état 2, procédure ConvertFromUTC, ligne 1
CREATE FUNCTION pour "ConvertFromUTC" a échoué car les types T-SQL et CLR pour la valeur de return ne correspondent pas.

(268,0): SQL72045: Erreur d'exécution du script

SQL généré à partir du file .net dans le but d'append la fonction:

 CREATE FUNCTION [dbo].[ConvertFromUTC] (@utctime DATETIME, @timezoneid NVARCHAR (MAX)) RETURNS TABLE ([localtime] DATETIME2 (7) NULL) AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC] 

Définition SQL pour la version de la fonction dans la database existante (ce qui confirme que @MattJohnson avait raison sur la façon dont il a besoin d'être corrigé):

 CREATE FUNCTION [dbo].[ConvertFromUTC] (@utctime [datetime], @timezoneid [nvarchar](4000)) RETURNS [datetime] WITH EXECUTE AS CALLER AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC] 

La fonction SQL ne correspond pas à la signature de la méthode .NET. Pour le faire correspondre:

  1. Changez le type de @utctime en DATETIME2 au lieu de DATETIME dans la définition de la fonction.

  2. Modifiez le type de return à simplement RETURNS DATETIME2 au lieu de renvoyer une table avec une colonne nulletime datetime2.

Notez également que si vous utilisez SQL 2016 ou une version ultérieure, ou Azure SQL DB, vous n'avez pas besoin de cette fonction, car vous pouvez désormais utiliser AT TIME ZONE .