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

尝试发布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 );
}

尝试发布时收到的错误消息是:

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

从.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,而不是返回带有可为null的datetime2列的表.

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

标签:sqlclr,c,net,sql-server
来源: https://codeday.me/bug/20191111/2018004.html