Muszę napisać funkcję, aby otrzymać znak ciągu i zwrócić format daty. Na przykład dane wejściowe to 20120101 i potrzebuję tego 01.01.2012. Problem polega na tym, że mogą występować nieprawidłowe dane, takie jak ten „2012ABCD”. W takim przypadku chcę, aby funkcja zwróciła ustaloną datę, na przykład 2020-01-01. Do tej pory napisałem:
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
To nie działa i po prostu nie wiem, jak obsługiwać drugą część (gdy dane wejściowe są niepoprawne).
sql-server
t-sql
functions
Pantea Tourang
źródło
źródło
yyyymmdd
formatu?Odpowiedzi:
W SQL Server 2012 i późniejszych można użyć TRY_CONVERT, aby sprawdzić, czy dane wejściowe można przekonwertować. Jeśli nie jest to możliwe, zwracana jest wartość NULL, a następnie możesz wykonać WSPÓŁPRACĘ, aby uzyskać wartość przeliczoną lub ustaloną datę.
Możesz także użyć
TRY CATCH
bloku i zwrócić ustaloną datę wCATCH
bloku, ale najlepszym rozwiązaniem jest użycie TRY_CONVERT, aby SQL Server nie musiał obsługiwać błędu, ponieważ wymaga to więcej czasu i zasobów.Funkcja dla tego typu kodu spowoduje większe obciążenie niż zwykłe użycie tej samej logiki w zapytaniu, więc jeśli jest wywoływana wiele razy na sekundę, możesz przeżuć znaczny zasób, używając dla niego funkcji. Rozumiem, że może to być wywołane z wielu fragmentów kodu, więc istnieje potrzeba, aby włączyć tę funkcję na wypadek, gdyby konieczna była zmiana domyślnej daty - wtedy nie ma zmian w skompilowanym kodzie i wystarczy zaktualizować tę funkcję.
Jeśli ten kod będzie często uruchamiany, należy rozważyć inne opcje, które zapewnią lepszą wydajność niż funkcja zdefiniowana przez użytkownika. Zapoznaj się z odpowiedzią Solomona, aby uzyskać przegląd dostępnych opcji i dodatkowe wyjaśnienie, dlaczego możesz wybrać jedną z nich.
Na przykład poniżej pokazano tę samą logikę zaimplementowaną jako wbudowana funkcja o wartościach w tabeli, która musi być używana z,
CROSS APPLY
jeśli nie jest dostarczana z wartością statyczną, ale działa znacznie lepiej niż skalarny UDF:źródło
FINALLY
bloku w T-SQL (myślę, że miałeś na myśliCATCH
). 2) prawdopodobnie powinieneś wspomnieć, żeTRY_CONVERT
zaczął się w 2012 roku (niektórzy ludzie utknęli przed SQL Server 2012). 3) Czy rozważałeś Inline TVF? Nie mają one takich samych problemów z wydajnością jak Skalarne UDF.