2012-04-03 85 views
1

問題: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

回答

4

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