Nie można utrwalić kolumny obliczeniowej - nie deterministycznej
Mam tę funkcję dla kolumny obliczeniowej:
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
DodałemWITH schemabinding
w nadziei, że uczyni to to deterministycznym, abym mógł to utrzymać. Powinien być jako dwa wejścia[Week]
i[Year]
zawsze przyniesie takie same wyniki.
Dokładny błąd to:
Obliczona kolumna „AllocatedTimeStart” w tabeli „Tmp_Bookings” nie może zostać utrwalona, ponieważ kolumna jest niedeterministyczna.
Używam tej formuły w kolumnie:
([dbo].[GetAllocatedStartTime]([Year],[Week]))
A defekty kolumn:
[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),
Jakieś pomysły?
EDYTOWAĆ:
Zmieniono linię na:
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
Ale teraz pojawia się błąd mówiący, że formuła kolumny jest nieprawidłowa. Nawet jeśli funkcja oszczędza dobrze.
EDYCJA 2:
Pokazałem dokładnie, co robię (lub przynajmniej spróbowałem). Naprawdę nie ma nic nadzwyczajnego. Jak mówi poprzednia funkcja (oryginalna) w połączeniu z formułą ref[dbo].AllocatedStartDate(...)
do tego w kolumnie zadziałało, ale nie trwało, mówiło, że nie jest deterministyczne. Zgodnie z sugestią zmieniłem FUNKCJĘ, zastępując część konwersji nowym kodem, więc funkcja wygląda teraz tak:
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
Następnie wypróbowałem tę samą formułę, co wcześniej w polu obliczeniowym(([dbo].[GetAllocatedStartTime]([Year],[Week])))
... i odrzuca formułę, mówi, że jest nieważna ... co jest dziwne, ponieważ formuła jest taka sama, więc musi to być pewnego rodzaju sprawdzenie zmienionej funkcji i stwierdzenie, że jest ona nieważna, co również jest dziwne ponieważ zrobiłem prostąSELECT dbo.GetAllocatedStartTime(2012,13)
i działało ...
Więc tak, jestem zdezorientowany i nigdy nie widziałemSqlFiddle
nieważne, używaj go. Ale tak naprawdę nie ma nic więcej niż to, co właśnie powiedziałem.