Используя SQL Server 2008, Visual Studio 2005, .net 2.0 с SP2 (имеет поддержку нового SQL Server 2 008 типов данных).
Я пытаюсь записать функцию SQLCLR, которая берет DateTime2 в качестве входа и возвращает другой DateTime2. например:
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 отобразились на DateTime2 SQL Server, таким образом, я пытаюсь выполнить этот 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 CREATE FUNCTION для "f_UTCToLocalDT", потому что T-SQL и типы CLR для возвращаемого значения не соответствуют.
Используя ДАТУ И ВРЕМЯ (вместо DATETIME2) хорошо работает. Но я использовал бы DATETIME2 для поддержки увеличенной точности. Что я делаю что-то не так, или DateTime2 не (полностью) поддерживается SQLCLR?
Вам необходимо изменить типы DateTime в сигнатуре вашего метода функции. SQLDateTime сопоставляется с DateTime в базе данных.
System.DateTime является более точным, и можно сопоставить с DateTime2 (но по умолчанию он будет удален как DateTime в сценарии развертывания).
[SqlFunction(DataAccess = DataAccessKind.None)]
//OLD Signature public static SqlDateTime UTCToLocalDT(SqlDateTime val)
public static DateTime UTCToLocalDT(DateTime val) {
...
}
Затем вы можете настроить сценарий развертывания для чтения.
CREATE FUNCTION [UTCToLocalDT]
(
@dt [datetime2]
)
RETURNS [datetime2]
AS
EXTERNAL NAME [SQLCLR].[MyCompany.SQLCLR.DateTimeHelpCLR].UTCToLocalDT
GO
Теперь выполнение функции должно давать более точный результат.
DECLARE @input DateTime2, @output DateTime2
SET @input = '2010-04-12 09:53:44.48123456'
SET @output = YourDatabase.dbo.[UTCToLocalDT](@input)
SELECT @input, @output