Ich habe eine XML-Spalte in einer Tabelle; Ich möchte einen bestimmten Wert in diesem XML als berechnete Spalte "hochstufen" und für schnellere Suche indizieren. Ich habe eine Funktion, die in der XML-Informationen nimmt und gibt das Element von Interesse, wie folgt aus:Persistent einer berechneten Datetime-Spalte in SQL Server 2005
CREATE FUNCTION [dbo].[fComputeValue] (@data XML)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'datetime')
END
Allerdings, wenn ich versuche, die berechnete Spalte zu erstellen:
ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS ([dbo].[fComputeValue]([CustomMetadataColumn])) PERSISTED
ich die folgende Fehlermeldung erhalten:
Msg 4936, Level 16, State 1, Line 2 Computed column 'StartDate' in table 'CustomMetadataTable' cannot be persisted because the column is non-deterministic.
Es funktioniert, wenn ich:
- arbeiten mit varchar, int, double (d. H. andere als Datetime) Werte
- das PERSISTED Stichwort entfernen (aber dann kann ich nicht einen Index für die Spalte)
Ich mag auch, dass die Datums- und Uhrzeitwerte erwähnen sind in XSD Datetime-Format erstellen. Irgendwelche Ideen? Vielen Dank.
Vielen Dank! Ich hatte das gleiche Problem. Ich frage mich, warum 127 funktioniert, wenn andere es nicht tun? – harpo
Dies ist der Grund: "Stile größer als 100 sind deterministisch, außer für die Stile 106, 107, 109 und 113." –
Anstatt die ALTER TABLE-Anweisung zu ändern, können Sie auch die fComputeValue-FUNCTION-Definition ändern: Die Funktion kann datetime zurückgeben, wie das OP es wollte, wenn Sie CONVERT mit Stil 127 im body/implementation der Funktion aufrufen. – ChrisW