J'ai une colonne XML dans une table; Je veux "promouvoir" une certaine valeur dans ce XML en tant que colonne calculée et l'indexer pour une recherche plus rapide. J'ai une fonction qui prend les informations XML et fournit l'élément d'intérêt, comme celui-ci:Persistance d'une colonne datetime calculée dans 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
Cependant, lorsque je tente de créer la colonne calculée:
ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS ([dbo].[fComputeValue]([CustomMetadataColumn])) PERSISTED
Je reçois l'erreur suivante:
Msg 4936, Level 16, State 1, Line 2 Computed column 'StartDate' in table 'CustomMetadataTable' cannot be persisted because the column is non-deterministic.
Il fonctionne si je:
- fonctionne avec varchar, int, double (c.-à-d. autre que datetime) valeurs
- supprimer le mot-clé PERSISTED (mais je ne peux pas créer un index sur la colonne)
Je dois aussi mentionner que les valeurs datetime sont en XSD le format datetime. Des idées? Merci.
Merci! J'ai eu le même problème. Je me demande pourquoi 127 fonctionne quand les autres ne le font pas? – harpo
C'est la raison: "Les styles supérieurs à 100 sont déterministes, sauf pour les styles 106, 107, 109 et 113." –
Au lieu de modifier l'instruction ALTER TABLE, vous pouvez également modifier la définition fComputeValue FUNCTION: la fonction peut renvoyer datetime comme l'OP le souhaitait, si vous invoquez CONVERT avec le style 127 dans le corps/implémentation de la fonction. – ChrisW