SQLCLR和DateTime2

时间:2010-04-12 07:39:17

标签: c# .net tsql sql-server-2008 sqlclr

使用SQL Server 2008,Visual Studio 2005,.net 2.0 with SP2(支持新的SQL Server 2008数据类型)。

我正在尝试编写一个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映射到SQL Server的DateTime2,所以我尝试运行这个T-SQL:

CREATE function hubg.f_UTCToLocalDT
(
    @dt DATETIME2
)
returns DATETIME2
AS
EXTERNAL NAME [SQLCLR].[MyCompany.SQLCLR.DateTimeHelpCLR].UTCToLocalDT
GO

这会出现以下错误:

  

Msg 6551,Level 16,State 2,Procedure   f_UTCToLocalDT,第1行创建功能   因为“f_UTCToLocalDT”失败了   返回值的T-SQL和CLR类型   不匹配。

使用DATETIME(而不是DATETIME2)工作正常。但我宁愿使用DATETIME2来支持提高的精度。我做错了什么,或者SQLCLR没有(完全)支持DateTime2?

2 个答案:

答案 0 :(得分:10)

您需要在函数方法的签名中更改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

答案 1 :(得分:0)

请注意使用“DateTime?”仍然总是给出构建错误(即使在使用sql 2012的VS 2013中),但显然结果是可用的,如果选择“构建,部署”然后使用obj文件夹中的文件,在sql查询窗口中编辑generated.sql文件(在执行时将DateTime2用作参数)将其添加到Sql Server 生成错误是“SQL46010:语法不正确”。“ 在\ obj \ Debug \ YourPrjName.generated.sql

(如果可以,请在上面发表评论。)