Ich muss eine Funktion schreiben, um ein Zeichenfolgenzeichen zu erhalten und das Datumsformat zurückzugeben. Zum Beispiel ist die Eingabe 20120101 und ich brauche diese 2012-01-01. Das Problem ist, dass möglicherweise falsche Eingaben wie diese "2012ABCD" vorliegen. In diesem Fall möchte ich, dass die Funktion ein festes Datum wie 2020-01-01 zurückgibt. Was ich bisher geschrieben habe ist:
Create Function ReturnDate
(@date varchar(8))
Returns date
as
begin
declare @result date
set @result = (select convert(date , @date,111))
if(@@ROWCOUNT>0) return @result
else return '2020-01-01'
return @result
end
Dies funktioniert nicht und ich weiß nur nicht, wie ich mit dem zweiten Teil umgehen soll (wenn die Eingabe falsch ist).
sql-server
t-sql
functions
Pantea Tourang
quelle
quelle
yyyymmdd
Format streng analysieren ?Antworten:
Unter SQL Server 2012 und höher können Sie mit TRY_CONVERT prüfen, ob die Eingabe konvertiert werden kann. Wenn dies nicht möglich ist, wird ein NULL-Wert zurückgegeben. Anschließend können Sie eine COALESCE ausführen, um entweder den konvertierten Wert oder das feste Datum abzurufen.
Sie können auch einen
TRY CATCH
Block verwenden und das feste Datum imCATCH
Block zurückgeben. Es wird jedoch empfohlen, TRY_CONVERT zu verwenden, damit SQL Server keinen Fehler behandeln muss, da dies mehr Zeit und Ressourcen erfordert.Eine Funktion für diesen Codetyp verursacht mehr Overhead als die Verwendung derselben Logik in der Abfrage. Wenn sie also mehrmals pro Sekunde aufgerufen wird, können Sie mithilfe einer Funktion erhebliche Ressourcen verbrauchen. Ich verstehe, dass dies aus zahlreichen Codeteilen aufgerufen werden kann, so dass der Wunsch besteht, es zu einer Funktion zu machen, falls das Standarddatum geändert werden muss - dann werden keine kompilierten Codeänderungen vorgenommen und diese Funktion nur aktualisiert.
Wenn dieser Code häufig ausgeführt wird, sollten Sie andere Optionen in Betracht ziehen, die eine bessere Leistung als eine benutzerdefinierte Funktion bieten. In Salomos Antwort finden Sie eine Übersicht über Ihre Optionen und eine weitere Erklärung, warum Sie eine über die andere wählen könnten.
Im Folgenden wird beispielsweise dieselbe Logik gezeigt, die als Inline-Tabellenwertfunktion implementiert ist, die verwendet werden muss,
CROSS APPLY
wenn kein statischer Wert angegeben wird, aber eine viel bessere Leistung als eine skalare UDF aufweist:quelle
FINALLY
Block in T-SQL (ich denke, Sie meintenCATCH
). 2) Sie sollten wahrscheinlich erwähnen, dass diesTRY_CONVERT
im Jahr 2012 begonnen hat (einige Leute stecken vor SQL Server 2012 fest). 3) Haben Sie eine Inline-TVF in Betracht gezogen? Diese haben nicht die gleichen Leistungsprobleme wie skalare UDFs.