Uso de SQL Server 2008, Visual Studio 2005, .net 2.0 con SP2 (tiene soporte para nuevos tipos de datos de SQL Server 2008).SQLCLR y DateTime2
Estoy tratando de escribir una función SQLCLR que toma un DateTime2 como entrada y devuelve otro DateTime2. p.ej. :
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);
}
}
}
Ahora, lo anterior compila bien. Quiero que estos SqlDateTimes para asignar a DateTime2 de SQL Server, así que trato de ejecutar este T-SQL:
CREATE function hubg.f_UTCToLocalDT
(
@dt DATETIME2
)
returns DATETIME2
AS
EXTERNAL NAME [SQLCLR].[MyCompany.SQLCLR.DateTimeHelpCLR].UTCToLocalDT
GO
Esto da el siguiente error:
Msg 6551, nivel 16, estado 2, Procedimiento f_UTCToLocalDT, línea 1 CREAR FUNCIÓN para "f_UTCToLocalDT" error porque T-SQL y tipos de CLR para el valor de retorno no coinciden.
El uso de DATETIME (en lugar de DATETIME2) funciona bien. Pero prefiero usar DATETIME2 para apoyar la mayor precisión. ¿Qué estoy haciendo algo mal, o es DateTime2 no (totalmente) compatible con SQLCLR?
Gracias por eso. ¿Esta técnica admite pasar y devolver valores NULL? –
¿Cómo puedo modificar una secuencia de comandos de implementación? No hay uno por lo que estoy lejos cuando haces clic derecho y eliges "Implementar" en Visual Studio. El objetivo del atributo SqlFunction es automatizar ese proceso para que pueda elegir implementar desde el menú contextual. – Triynko
Y no ... esto no admite nulos, ya que tendría que usar Nullable, que no parece ser compatible. No se puede implementar incluso en Visual Studio 2010 Ultimate. –
Triynko