Wird jemand bestätigen, dass mir hier nicht einfach etwas fehlt, bevor ich ein Verbindungselement bezüglich des Mangels an Dokumentation dazu poste?
Auf der Dokumentenseite, auf der format
eine Zeichenfolgenfunktion aufgeführt ist:
"Alle integrierten Zeichenfolgenfunktionen sind deterministisch." - String-Funktionen (Transact-SQL)
Es wird auch nicht erwähnt, format
dass es auf verwandten Seiten nicht deterministisch ist:
Wenn Sie jedoch versuchen, eine dauerhaft berechnete Spalte zu erstellen:
create table t (date_col date);
insert into t values (getdate());
alter table t add date_formatted_01 as format(date_col,'YYYY') persisted;
Gibt den folgenden Fehler zurück:
Die berechnete Spalte 'date_formatted_01' in der Tabelle 't' kann nicht beibehalten werden, da die Spalte nicht deterministisch ist.
Die Dokumentation besagt, dass
Wenn das Kulturargument nicht angegeben wird, wird die Sprache der aktuellen Sitzung verwendet.
Das Hinzufügen eines Kulturarguments ändert jedoch nichts
Dies schlägt ebenfalls fehl
alter table t add date_formatted_02 as format(date_col, 'd', 'en-US' ) persisted
Rextester-Demo: http://rextester.com/ZMS22966
dbfiddle.uk-Demo: http://dbfiddle.uk/?rdbms=sqlserver_next&fiddle=7fc57d1916e901cb561b551af144aed6
quelle
alter table #t add date_formatted_01 as CONVERT(VARCHAR(20), FORMAT(date_col, 'YYYY', 'en-US')) persisted;
. Ich bin mir nicht sicher, warumFORMAT
das nicht deterministisch ist, besonders wenn ich die Kultur spezifiziere. Diedate_formatted
Spalte kann seinVARCHAR(20)
(noch anhielt) und stellen Sie über TriggerFORMAT
. Oder SQLCLR funktioniert. Mit der SQL # SQLCLR-Bibliothek (die ich geschrieben habe) können Sie dies tunALTER TABLE SQL#.t ADD date_formatted_03 AS SQL#.Date_Format(date_col, 'd', 'en-US') PERSISTED;
(Tabelle gehört SQL #, da Tabelle und Funktionseigentümer identisch sein müssen).Antworten:
Eine Funktion ist nicht unbedingt deterministisch oder nicht deterministisch. Es gibt einige Funktionen, die je nach Verwendung deterministisch sein können :
CAST
undCONVERT
sind solche Beispiele. Basierend auf den Tests, die Sie bisher durchgeführt haben, denke ich, dass es fair ist zu sagen, dass diesFORMAT
nicht immer deterministisch ist, obwohl es sich um eine Zeichenfolgenfunktion handelt. Wenn Sie wissen möchten, ob es manchmal deterministisch ist, kann ich mir nur vorstellen, genug verschiedene Methoden auszuprobieren, um es zu nennen, bis Sie zufrieden sind. Betrachten wir zum Beispiel,FORMAT
wie es auf Zahlen angewendet wird. Es gibt nur zehn verschiedene numerische Eingabetypen :Es scheint auch nur neun verschiedene numerische Formate zu geben . Es ist möglich, dauerhafte Spalten für alle möglichen Kombinationen zu erstellen. Ein Code dafür ist unten:
Hier ist ein Beispiel für die Ausgabe:
Ich konnte keine der Spalten für einige Eingabewerte und Kulturen zur Tabelle hinzufügen. Ich habe nicht alle möglichen Kulturen ausführlich ausprobiert, da ich in SQL Server keine Liste finden kann.
Zumindest scheint es sicher zu sein, dass die Dokumentation bezüglich des Determinismus von
FORMAT
falsch ist, daher würde ich empfehlen, ein Verbindungselement dafür einzureichen.quelle
Die
FORMAT
Dokumentation wurde jetzt aktualisiert (als Antwort auf Ihr Connect-Element ), um Folgendes zu sagen:Ebenso enthalten String-Funktionen (Transact-SQL) jetzt:
quelle
Ich bin kein regulärer Benutzer von sqlserver, daher könnte ich mich irren, aber ich vermute, dass das Format keine Zeichenfolgenfunktion ist. Laut Dokumentation:
https://docs.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql
Das Format verwendet entweder einen Datumstyp oder einen numerischen Typ als Argument. Wenn Sie nur den Jahresteil eines Datums erfassen möchten, können Sie die Jahresfunktion nicht verwenden?
Wenn Sie eine Zeichenfolgendarstellung wünschen:
quelle