SQL标量值函数返回NULL
我有值函数返回数据为VARCHAR(MAX)或NULL(以下功能)的标量,我使用这个功能,爆炸很长的文本字符串和抢单值(多种数据类型)。
我现在试图将这些数据插入到另一个表中,但转换为正确的数据类型,但如果返回的值为null,则失败。
我试图填充字段是DATETIME NULL
所以如果函数返回空值我想只要选择空,否则我想给VARCHAR
转换为DATETIME
,所以到目前为止,我有:
(SELECT CONVERT(DATETIME, dbo.UDEF_GetFromTextString('Date=', ',', RawData))) AS LineDate,
我不能做的是处理空值和转换为DATETIME
,有人可以给我一个线路功能来做到这一点(如果可能的话,无需两次调用该功能)?
错误:
Msg 242, Level 16, State 3, Procedure UDEF_DC_TRANSLATE_CALL_DATA, Line 11
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
UDEF_GetFromTextString功能
CREATE FUNCTION [dbo].[UDEF_GetFromTextString]
-- Input start and end and return value.
(@uniqueprefix VARCHAR(100),
@commonsuffix VARCHAR(100),
@datastring VARCHAR(MAX))
RETURNS VARCHAR(MAX) -- Picked Value.
AS
BEGIN
DECLARE @ADJLEN INT = LEN(@uniqueprefix)
SET @datastring = @datastring + @commonsuffix
RETURN (
CASE WHEN (CHARINDEX(@uniqueprefix,@datastring) > 0)
AND (CHARINDEX(@uniqueprefix + @commonsuffix,@datastring) = 0)
THEN SUBSTRING(@datastring, PATINDEX('%' + @uniqueprefix + '%',@datastring)[email protected], CHARINDEX(@commonsuffix,@datastring,PATINDEX('%' + @uniqueprefix + '%',@datastring))- PATINDEX('%' + @uniqueprefix + '%',@datastring)[email protected]) ELSE NULL END
)
END
编辑:
从AakashM非常有益的帮助后,我所在行和值造成错误,它是试图通过DD-MM-YYYY为MM-DD-YYYY,工作,直到有一天一个价值超过12
要解决它,我只是改变了:
(SELECT CONVERT(DATETIME, UDEF_GetFromTextString('Date=', ',', RawData))) AS CallDate
要:
(SELECT CONVERT(DATETIME, UDEF_GetFromTextString('Date=', ',', RawData), 105)) AS CallDate
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
这不抱怨不能够NULL
从varchar
转换为datetime
。这是抱怨转换并结束日期超出范围datetime
。证明:
返回用于设置日期像字符串,或者NULL
样品功能:
create function Fexample (@i int) RETURNS varchar(max)
as
begin
return case
when @i = 5 then '2012-05-16'
when @i = 2 then '1750-01-01'
else null end
end
go
某些值传递给该函数:
declare @a table (ii int, s datetime null)
--insert @a values (2, null)
insert @a values (3, null)
insert @a values (5, null)
update @a
set s =convert(datetime, dbo.Fexample(ii))
select * from @a
随着注释行原样,我们得到
ii s
----------- -----------------------
3 NULL
5 2012-05-16 00:00:00.000
表明NULL
是罚款,从返回值 功能。然而,取消对2
线,我们得到
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
,因为1750年是描述范围的datetime
(这是1753至9999)前。
这肯定是问题,以及发现!我遇到的下一个问题是找到违规价值。我已经检查不同值的日期和时间,日期都在2012年和时间是00:00:00和02:00:00之间。转换'00:00:00 => DATETIME'有问题吗? – bendataclear 2012-04-03 10:56:37
如果您有机会获得实时数据,我不知道的比写的是通过数据游标一些诊断代码,试图依次对每一行转换一个更好的办法...... – AakashM 2012-04-03 11:03:10
我有机会,所以我会运行通过这个现在(*网上搜寻TSQL CURSOR):) – bendataclear 2012-04-03 11:11:50
“它的失败,如果返回值是空” - 有什么错误信息? – AakashM 2012-04-03 09:41:18
对问题添加了错误。 – bendataclear 2012-04-03 09:43:04