Czy zanim opublikuję element dotyczący braku dokumentacji na ten temat, czy ktoś potwierdzi, że czegoś tu nie brakuje?
Na stronie dokumentów, gdzie format
jest wymieniony jako funkcja ciągu:
„Wszystkie wbudowane funkcje łańcuchowe są deterministyczne.” - Funkcje ciągów (Transact-SQL)
Nie ma też wzmianki o format
niedeterministyczności na powiązanych stronach:
Jednak podczas próby utworzenia utrwalonej kolumny obliczanej:
create table t (date_col date);
insert into t values (getdate());
alter table t add date_formatted_01 as format(date_col,'YYYY') persisted;
Zwraca następujący błąd:
Obliczona kolumna „data_formatowana_01” w tabeli „t” nie może zostać utrwalona, ponieważ kolumna nie jest deterministyczna.
Dokumentacja stwierdza, że
Jeśli argument kultury nie zostanie podany, zostanie użyty język bieżącej sesji.
ale dodanie argumentu dotyczącego kultury nic nie zmienia
To również się nie udaje
alter table t add date_formatted_02 as format(date_col, 'd', 'en-US' ) persisted
demo rextestera: http://rextester.com/ZMS22966
demo dbfiddle.uk: http://dbfiddle.uk/?rdbms=sqlserver_next&fiddle=7fc57d1916e901cb561b551af144aed6
źródło
alter table #t add date_formatted_01 as CONVERT(VARCHAR(20), FORMAT(date_col, 'YYYY', 'en-US')) persisted;
. Nie jestem pewien, dlaczegoFORMAT
nie jest deterministyczny, szczególnie przy określaniu kultury.date_formatted
Kolumna może byćVARCHAR(20)
(jeszcze utrzymywały) i ustawiona za pomocą wyzwalaczaFORMAT
. Lub działa SQLCLR. Korzystając z biblioteki SQL # SQLCLR (którą napisałem), możesz to zrobićALTER TABLE SQL#.t ADD date_formatted_03 AS SQL#.Date_Format(date_col, 'd', 'en-US') PERSISTED;
(tabela jest własnością SQL #, ponieważ właściciel tabeli i funkcji musi być taki sam).Odpowiedzi:
Funkcja niekoniecznie musi być deterministyczna lub niedeterministyczna. Istnieje kilka funkcji, które mogą być deterministyczne w zależności od sposobu ich użycia :
CAST
iCONVERT
są takimi przykładami. Bazując na testach, które przeprowadziłeś do tej pory, myślę, że można śmiało powiedzieć, żeFORMAT
nie zawsze jest to deterministyczne, mimo że jest funkcją strunową. Jeśli chcesz wiedzieć, czy czasami jest to deterministyczne, jedyną techniką, jaką mogę wymyślić, jest wypróbowanie wystarczająco wielu różnych sposobów nazywania go, dopóki nie będziesz zadowolony. RozważmyFORMAT
na przykład, w odniesieniu do liczb. Istnieje tylko dziesięć różnych typów wprowadzania numerycznego :Wydaje się również, że istnieje tylko dziewięć różnych formatów numerycznych . Można spróbować utworzyć trwałe kolumny dla wszystkich możliwych kombinacji. Poniżej znajduje się kod do zrobienia tego:
Oto próbka danych wyjściowych:
Nie byłem w stanie uzyskać żadnej kolumny, która mogłaby zostać dodana do tabeli dla kilku wartości wejściowych i kultur. Nie wypróbowałem wyczerpująco wszystkich możliwych kultur, ponieważ nie mogę znaleźć ich listy w SQL Server.
FORMAT
Przynajmniej wydaje się bezpiecznie stwierdzić, że dokumentacja dotycząca determinizmu jest niepoprawna, dlatego zaleciłbym przesłanie w tym celu elementu Connect.źródło
FORMAT
Dokumentacja została zaktualizowana (w odpowiedzi na swojej pozycji Połącz ), aby powiedzieć:Podobnie funkcje ciągów (Transact-SQL) obejmują teraz:
źródło
Nie jestem zwykłym użytkownikiem sqlserver, więc mogę się mylić, ale domyślam się, że format nie jest funkcją łańcuchową. Zgodnie z dokumentacją:
https://docs.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql
Format przyjmuje jako argument typ daty lub typ liczbowy. Jeśli wszystko, co chcesz zrobić, to złapać część roku na randkę, czy nie możesz użyć funkcji roku?
jeśli chcesz reprezentację ciągu:
źródło