c# – SQLCLR和DateTime2
使用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 这会出现以下错误:
使用DATETIME(而不是DATETIME2)工作正常.但我宁愿使用DATETIME2来支持提高的精度.我做错了什么,或者SQLCLR没有(完全)支持DateTime2? 解决方法
您需要在函数方法的签名中更改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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |