SQLCLR и DateTime2

Используя 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?

6
задан Moe Sisko 12 April 2010 в 07:39
поделиться

1 ответ

Вам необходимо изменить типы 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
10
ответ дан 10 December 2019 в 00:36
поделиться