尝试发布 SQL CLR 数据库的日期时间类型不匹配
Datetime type mismatch trying to publish a SQL CLR database
我正在尝试建立一个旧的解决方案,该解决方案将许多 .net 函数发布到 SQL 服务器数据库。但是发布到新数据库的尝试在操作日期的函数上失败了。
失败的函数是:
[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 );
}
我在尝试发布时收到的错误消息是:
Creating [dbo].[ConvertFromUTC]...
(268,1): SQL72014: .Net SqlClient Data Provider:
Msg 6551, Level 16, State 2, Procedure ConvertFromUTC, Line 1
CREATE FUNCTION for "ConvertFromUTC" failed because T-SQL and CLR types for return value do not match.
(268,0): SQL72045: Script execution error
SQL 从 .net 生成,试图添加函数:
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
。
将 return 类型更改为仅 RETURNS DATETIME2
而不是 returning 具有可为 null 的 datetime2 列的 table。
另请注意,如果您使用的是 SQL 2016 或更高版本,或者使用 Azure SQL 数据库,则不需要此功能,因为您现在可以使用 AT TIME ZONE
相反。
我正在尝试建立一个旧的解决方案,该解决方案将许多 .net 函数发布到 SQL 服务器数据库。但是发布到新数据库的尝试在操作日期的函数上失败了。
失败的函数是:
[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 );
}
我在尝试发布时收到的错误消息是:
Creating [dbo].[ConvertFromUTC]...
(268,1): SQL72014: .Net SqlClient Data Provider:
Msg 6551, Level 16, State 2, Procedure ConvertFromUTC, Line 1
CREATE FUNCTION for "ConvertFromUTC" failed because T-SQL and CLR types for return value do not match.(268,0): SQL72045: Script execution error
SQL 从 .net 生成,试图添加函数:
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
。将 return 类型更改为仅
RETURNS DATETIME2
而不是 returning 具有可为 null 的 datetime2 列的 table。
另请注意,如果您使用的是 SQL 2016 或更高版本,或者使用 Azure SQL 数据库,则不需要此功能,因为您现在可以使用 AT TIME ZONE
相反。