尝试发布 SQL CLR 数据库的日期时间类型不匹配



我正在尝试建立一个旧的解决方案,该解决方案将许多.net函数发布到SQL Server数据库。但是,在操作日期的函数上,尝试发布到新数据库失败。

失败的函数是:

[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]。转换自UTC]...

(268,1(: SQL72014: .Net SqlClient 数据提供程序:

Msg 6551,级别 16,状态 2,过程转换自 UTC,第 1 行 创建
"转换自 UTC"的函数失败,因为返回值的 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 方法签名不匹配。 要使其匹配:

  1. 更改要DATETIME2@utctime的类型,而不是在函数定义中DATETIME

  2. 将返回类型更改为仅RETURNS DATETIME2,而不是返回具有可为空的 datetime2 列的表。

另请注意,如果你使用的是 SQL 2016 或更高版本,或者使用的是 Azure SQL DB,则不需要此功能,因为现在可以改用AT TIME ZONE

最新更新