尝试发布SQL CLR数据库的日期时间类型不匹配
我试图站起来将一些.net函数发布到SQL Server数据库的旧解决方案。 但是,发布到新数据库的尝试在操作日期的函数上失败。
失败的function是:
[SqlFunction(TableDefinition="localtime datetime2", IsDeterministic=true, IsPrecise=true, DataAccess=DataAccessKind.None, SystemDataAccess=SystemDataAccessKind.None)] public static DateTime ConvertFromUTC(DateTime utctime, string timezoneid) { if (utctime.Kind == DateTimeKind.Unspecified) utctime = DateTime.SpecifyKind( utctime, DateTimeKind.Utc ); utctime = utctime.ToUniversalTime(); return TimeZoneInfo.ConvertTimeBySystemTimeZoneId( utctime, timezoneid ); }
我尝试发布时收到的错误消息是:
创建[dbo]。[ConvertFromUTC] …
(268,1):SQL72014:.Net SqlClient数据提供程序:
消息6551,级别16,状态2,过程ConvertFromUTC,第1行
“ConvertFromUTC”的CREATE FUNCTION失败,因为返回值的T-SQL和CLR类型不匹配。(268,0):SQL72045:脚本执行错误
从.net生成的SQL,试图添加该函数:
CREATE FUNCTION [dbo].[ConvertFromUTC] (@utctime DATETIME, @timezoneid NVARCHAR (MAX)) RETURNS TABLE ([localtime] DATETIME2 (7) NULL) AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC]
现有数据库中函数版本的SQL定义(确认@MattJohnson对于如何修复它是正确的):
CREATE FUNCTION [dbo].[ConvertFromUTC] (@utctime [datetime], @timezoneid [nvarchar](4000)) RETURNS [datetime] WITH EXECUTE AS CALLER AS EXTERNAL NAME [database].[IntelligentTutor.Database.Functions].[ConvertFromUTC]
SQL函数与.NET方法签名不匹配。 使它匹配:
-
在函数定义
@utctime
的类型更改为DATETIME2
而不是DATETIME
。 -
将返回类型更改为
RETURNS DATETIME2
而不是返回具有可为空的datetime2列的表。
另请注意,如果您使用的是SQL 2016或更高版本,或者在Azure SQL DB上,则不需要此function,因为您现在可以使用AT TIME ZONE
。