SQL标量值函数返回NULL

问题描述:

问题: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 
+1

“它的失败,如果返回值是空” - 有什么错误信息? – AakashM 2012-04-03 09:41:18

+0

对问题添加了错误。 – bendataclear 2012-04-03 09:43:04

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

这不抱怨不能够NULLvarchar转换为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)前。

+0

这肯定是问题,以及发现!我遇到的下一个问题是找到违规价值。我已经检查不同值的日期和时间,日期都在2012年和时间是00:00:00和02:00:00之间。转换'00:00:00 => DATETIME'有问题吗? – bendataclear 2012-04-03 10:56:37

+0

如果您有机会获得实时数据,我不知道的比写的是通过数据游标一些诊断代码,试图依次对每一行转换一个更好的办法...... – AakashM 2012-04-03 11:03:10

+0

我有机会,所以我会运行通过这个现在(*网上搜寻TSQL CURSOR):) – bendataclear 2012-04-03 11:11:50