У меня есть эта функция для вычисляемого столбца:
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
Я добавил WITH schemabinding
в надежде, что это сделает его детерминированным и я смогу сохранить его. Так должно быть, поскольку два входа [Week]
и [Year]
всегда будут давать одинаковые результаты.
Точная ошибка:
Невозможно сохранить вычисляемый столбец AllocatedTimeStart в таблице Tmp_Bookings, поскольку этот столбец недетерминирован.
Я использую эту формулу в столбце:
([dbo].[GetAllocatedStartTime]([Year],[Week]))
И столбец defs:
[Week] [int] NOT NULL,
[Year] [int] NOT NULL,
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])),
Любые идеи?
РЕДАКТИРОВАТЬ:
Строка изменена на:
RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1))))
Но теперь я получаю сообщение об ошибке, что формула для столбца недействительна. Хоть функция спасает нормально.
ИЗМЕНИТЬ 2:
Я точно показал, что делаю (или, по крайней мере, пробовал). На самом деле ничего лишнего. Как говорится, предыдущая функция (исходная) в сочетании с формулой ref [dbo].AllocatedStartDate(...)
для нее в столбце работала, но не сохранялась, она сказала, что она недетерминированная. Итак, согласно предложению, я изменил ФУНКЦИЮ, заменив часть преобразования новым кодом, так что теперь функция выглядит так:
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
Затем я попробовал ту же формулу, что и раньше, в вычисляемом поле (([dbo].[GetAllocatedStartTime]([Year],[Week])))
... и он отвергает формулу, говорит, что она недействительна ... что странно, поскольку формула такая же, поэтому он должен выполнять какую-то проверку изменил функцию и обнаружил, что это недействительно, что также странно, потому что я сделал простой SELECT dbo.GetAllocatedStartTime(2012,13)
, и он сработал ...
Так что да, я сбит с толку, и я никогда не видел, чтобы SqlFiddle
не говоря уже о его использовании. Но на самом деле это не более чем то, что я только что сказал.
RETURN dateadd(...)
? - person Andriy M   schedule 02.01.2013RETURN
. Синтаксис определения вычисляемого столбца -ColumnName AS expression
.RETURN
не может быть частью выражения, просто отбросьте его и оставьтеdateadd(...)
. Сказав это, я действительно не понимаю, где Дэмиен предлагает заменить ваш UDF фактическим выражением. Он просто говорит вам, как сделать ваше выражение (и, как следствие, вашу функцию) детерминированным. - person Andriy M   schedule 02.01.2013PERSISTED
. Не могли бы вы создать небольшой, но полный пример в виде единого скрипта, который демонстрирует проблему? (Возможно использование sqlfiddle для его размещения) - person Damien_The_Unbeliever   schedule 02.01.2013