SQL 在函数调用中转换输入参数的数据类型
SQL Convert datatype of input parameter inside Function call
我有以下功能:
CREATE FUNCTION dbo.ToDotNetDateTime ( @Ticks bigint )
RETURNS datetime2
AS
BEGIN
DECLARE @DateTime datetime2 = '00010101';
SET @DateTime = DATEADD( DAY, @Ticks / 864000000000, @DateTime );
SET @DateTime = DATEADD( SECOND, ( @Ticks % 864000000000) / 10000000, @DateTime );
RETURN DATEADD( NANOSECOND, ( @Ticks % 10000000 ) * 100, @DateTime );
END
当我在调用此函数时尝试将 nvarchar 转换为 bigint 时出现错误:
select dbo.ToDotNetDateTime(CAST(UTC_Time AS BIGINT)) FROM OtoSuite_Master_Reply
错误说:将数据类型 nvarchar 转换为 bigint 时出错
您的代码在函数本身中没有从字符串到 bigint
的类型转换。这表明问题出在调用函数 CAST(UTC_Time AS BIGINT)
.
您可以使用以下方法找到问题值:
select UTC_Time
from OtoSuite_Master_Reply
where try_CAST(UTC_Time AS BIGINT) is null and UTC_Time is not null;
要解决这个问题,您可以只使用 TRY_CAST()
,但您应该找到有问题的值并修复它们。
请首先检查 UTC_Time 要转换的有效数值。您可以使用下面的查询,它首先检查 UTC_Time 列是否为数字。
select dbo.ToDotNetDateTime(CAST(UTC_Time AS BIGINT)) FROM OtoSuite_Master_Reply
ISNUMERIC(UTC_Time ) = 1
但是此查询将忽略 ISNUMERIC(UTC_Time ) = 1
为假的值。
我有以下功能:
CREATE FUNCTION dbo.ToDotNetDateTime ( @Ticks bigint )
RETURNS datetime2
AS
BEGIN
DECLARE @DateTime datetime2 = '00010101';
SET @DateTime = DATEADD( DAY, @Ticks / 864000000000, @DateTime );
SET @DateTime = DATEADD( SECOND, ( @Ticks % 864000000000) / 10000000, @DateTime );
RETURN DATEADD( NANOSECOND, ( @Ticks % 10000000 ) * 100, @DateTime );
END
当我在调用此函数时尝试将 nvarchar 转换为 bigint 时出现错误:
select dbo.ToDotNetDateTime(CAST(UTC_Time AS BIGINT)) FROM OtoSuite_Master_Reply
错误说:将数据类型 nvarchar 转换为 bigint 时出错
您的代码在函数本身中没有从字符串到 bigint
的类型转换。这表明问题出在调用函数 CAST(UTC_Time AS BIGINT)
.
您可以使用以下方法找到问题值:
select UTC_Time
from OtoSuite_Master_Reply
where try_CAST(UTC_Time AS BIGINT) is null and UTC_Time is not null;
要解决这个问题,您可以只使用 TRY_CAST()
,但您应该找到有问题的值并修复它们。
请首先检查 UTC_Time 要转换的有效数值。您可以使用下面的查询,它首先检查 UTC_Time 列是否为数字。
select dbo.ToDotNetDateTime(CAST(UTC_Time AS BIGINT)) FROM OtoSuite_Master_Reply
ISNUMERIC(UTC_Time ) = 1
但是此查询将忽略 ISNUMERIC(UTC_Time ) = 1
为假的值。