Ne peut pas persister colonne calculée - non déterministe
J'ai cette fonction pour une colonne calculée :
CREATE FUNCTION [dbo].[GetAllocatedStartTime](@Year INT, @Week INT)
RETURNS DATETIME
WITH schemabinding
AS BEGIN
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(1))))
END
GO
J'ai ajouté le WITH schemabinding
dans l'espoir que ce serait déterministe afin que je puisse persister. Il faut que les deux entrées [Week]
et [Year]
produisent toujours les mêmes résultats.
L'erreur exacte est :
Colonne calculée 'AllocatedTimeStart' dans la table 'Tmp_Bookings' ne peut pas être conservé, car la colonne est non-déterministe.
Je suis à l'aide de cette formule dans la colonne :
([dbo].[GetAllocatedStartTime]([Year],[Week]))
Et la colonne defs :
[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),
Des idées?
EDIT:
Changé de ligne :
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
Mais maintenant j'ai une erreur disant que la formule pour la colonne n'est pas valide. Même si la fonction enregistre bien.
EDIT 2:
J'ai montré exactement ce que je suis en train de faire (ou au moins j'ai essayé). Il n'y a rien de plus vraiment. Comme il est dit de la fonction précédente (original), couplé avec la formule ref [dbo].AllocatedStartDate(...)
dans la colonne travaillé, mais n'a pas été persistant, il dit qu'il est non déterministe. Ainsi, selon la suggestion que j'ai modifié la FONCTION, en remplacement de la conversion de la partie avec le nouveau code, la fonction ressemble maintenant à :
FUNCTION [dbo].[GetSTime](@Year INT, @Week INT)
RETURNS DATETIME
WITH schemabinding
AS BEGIN
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
END
Ensuite, j'ai essayé la même formule que précédemment dans le champ calculé (([dbo].[GetAllocatedStartTime]([Year],[Week])))
... et il rejette la formule, affirme que ses pas valide... ce qui est étrange que la formule est la même, donc il doit être en train de faire un certain type de contrôle de l'évolution de la fonction et de trouver que, pour être valide, ce qui est aussi étrange parce que j'ai fait une plaine SELECT dbo.GetAllocatedStartTime(2012,13)
et cela a fonctionné...
Donc, oui, je suis confus, et je n'ai jamais vu SqlFiddle
jamais l'esprit de l'utiliser. Mais il n'y a vraiment rien de plus que ce que je viens de dire.
Quelle version de SQL Server est-ce pour?
2008 R2
Qui ligne avez-vous changé? Voulez-vous dire que vous avez changé la définition de colonne calculée à utiliser
RETURN dateadd(...)
directement?Regarde comme il y a un problème avec SQL Violon. Ne ceci mieux travailler? sqlfiddle.com/#!6/8fd88/1/0
OriginalL'auteur sprocket12 | 2013-01-02
Vous devez vous connecter pour publier un commentaire.
CONVERT([varchar](4),@Year,(0))+'-01-01'
est passé à uneDATEDIFF
appel, dans une position où une date est prévue, forcer une conversion implicite de se produire.De l'application des règles pour les fonctions déterministes:
Bien, vous êtes d'appel non plus, mais vous êtes en s'appuyant sur une conversion implicite, que je m'attends à agir comme
CAST
. Plutôt que de compter sur ce, j'aimerais passer à l'utilisation deCONVERT
et de donner un déterministe paramètre de style.Donc, j'avais à faire:
CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)
à sa place. L'ayant fait, la fonction elle-même devient déterministeCONVERT([varchar](4),@Year,(0))+'-01-01'
- leDATEFROMPARTS([Year],1,1)
fonction: SQL-Violon testSalut à tous j'ai essayé de remplacer la partie, mais j'ai frappé un autre problème :/ s'il vous plaît voir modifier ci-dessus.
OriginalL'auteur Damien_The_Unbeliever