2012-04-03 5 views
1

Problem:SQL Scalar Valued Function Return Null

ich eine Scalar Wertfunktion haben Daten als VARCHAR (MAX) oder NULL (Funktion unten) zurückkehrt, ich diese Funktion bin mit einem langen Textzeichenfolge und greifen zu explodieren einzelne Werte (von mehreren Datentypen).

Ich versuche jetzt, diese Daten in eine andere Tabelle einzufügen, aber in richtige Datentypen konvertiert, aber es schlägt fehl, wenn der zurückgegebene Wert Null ist.

Das Feld ist zu füllen Ich versuche DATETIME NULL so, wenn die Funktion null zurück Ich möchte nur null wählen, sonst will ich die VARCHAR zu einem DATETIME konvertieren, so weit ich habe:

(SELECT CONVERT(DATETIME, dbo.UDEF_GetFromTextString('Date=', ',', RawData))) AS LineDate, 

Was ich nicht tun kann, ist beide behandeln den Nullwert und konvertieren zu einem DATETIME, kann jemand mir eine Linienfunktion geben, um dies zu tun (wenn möglich, ohne die Funktion zweimal aufzurufen)?

Fehler:

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 FUNCTION

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 

Edit:

Nach der sehr nützliche Hilfe von AakashM, ich die Linie und Wert gelegt haben verursacht der Fehler war es Versuch passieren dd-mm-yyyy als mm-dd-yyyy, arbeiten, bis ein Wert für den Tag war über 12.

Um es zu beheben ich gerade geändert:

(SELECT CONVERT(DATETIME, UDEF_GetFromTextString('Date=', ',', RawData))) AS CallDate 

An:

(SELECT CONVERT(DATETIME, UDEF_GetFromTextString('Date=', ',', RawData), 105)) AS CallDate 
+1

"Es schlägt fehl, wenn der zurückgegebene Wert null ist" - Was ist die Fehlermeldung? – AakashM

+0

Fehler zu Frage hinzugefügt. – bendataclear

Antwort

4

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

Dies ist nicht beschweren über nicht in der Lage zu sein NULLvarchar-datetime zu konvertieren. Dies beschwert sich über die Konvertierung und endet mit einem Datum außerhalb des Bereichs von datetime. Beweis:

Eine Beispielfunktion, die entweder ein Datum ähnliche String zurückgibt, oder 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 

Einige Werte dieser Funktion zu übergeben:

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 

Mit der kommentierten Zeile wie sie ist , erhalten wir

ii   s 
----------- ----------------------- 
3   NULL 
5   2012-05-16 00:00:00.000 

zeigt, dass NULL ist in Ordnung als Rückgabewert von die Funktion. Allerdings Kommentar- der 2 Linie und wir bekommen

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

, weil das Jahr 1750 vor dem darstellbaren Bereich von datetime ist (das 1753-9999 ist).

+0

Das ist definitiv das Problem, gut entdeckt! Das nächste Problem, das ich habe, ist, den beleidigenden Wert zu finden. Ich habe verschiedene Werte für Datum und Uhrzeit überprüft, die Daten sind alle im Jahr 2012 und die Zeiten liegen zwischen 00:00:00 und 02:00:00. Gibt es ein Problem bei der Konvertierung von '00:00:00 => DATETIME'? – bendataclear

+0

Wenn Sie Zugriff auf die Live-Daten haben, kenne ich keinen besseren Weg, als einen Diagnosecode zu schreiben, der durch die Daten cursoriert und versucht, die Konvertierung für jede Zeile der Reihe nach ... – AakashM

+0

Ich habe Zugriff, also werde ich laufen durch diese jetzt (* google TSQL CURSOR) :) – bendataclear

Verwandte Themen