Вот мой лучший ответ ответить на исходный вопрос:
Попробуйте это:
/* create a deterministic schema bound function */
CREATE FUNCTION FloorDate(@dt datetime)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN CONVERT(datetime, FLOOR(CONVERT(float, @dt)))
END
GO
Чтобы проверить, попробуйте следующее. Пожалуйста, обратите внимание на использование «PERSISTED» для вычисляемого столбца и использования [DBO.] При обращении к функции
/*create a test table */
CREATE TABLE [dbo].[TableTestFloorDate](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TestDate] [datetime] NOT NULL,
[TestFloorDate] AS ([dbo].[FloorDate]([TestDate])) PERSISTED,
CONSTRAINT [PK_TableTestFloorDate] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
Теперь вы должны иметь возможность добавлять индекс по вычисляемого столбца (но см Гоча позже)
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestFloorDate)
Вставьте некоторые случайные данные, как столько раз, сколько вы хотите, но более (1000+) лучше, если вы хотите, чтобы проверить использование индекса/выполнение планов
INSERT INTO TableTestFloorDate (TestDate) VALUES(convert(datetime, RAND()*50000))
Получить результаты
SELECT * FROM TableTestFloorDate WHERE TestFloorDate='2013-2-2'
Теперь вот Гоча ... индекс, который был создан на вычисляемого столбца не используется! Вместо этого, даже при выборе данных в сохраняемом поле TestFloorDate, SQLServer (или, по крайней мере, моя версия) предпочитает индекс TestDate.
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestDate)
Я довольно уверен (из памяти), что индексы по вычислено, сохранялись столбцы имеют преимущество с точки зрения производительности - Я думаю, вы просто должны попробовать/тест для своих конкретных использований
(Надеюсь, я помог!)
Да, это так. Но откуда эта ошибка? – Tomalak 2008-11-21 17:30:39
getDate не является детерминированным. Я считаю, что это было бы причиной – kristof 2008-11-21 17:32:56
Да, вот почему! – 2008-11-21 17:36:32