AFAIK, вы не собираетесь обойти детерминированную функцию для требования SCHEMABINDING.Вы всегда будете получать ошибку
Функция 'getdate' дает недетерминированные результаты.Используйте детерминированную системную функцию или измените пользовательскую функцию для возврата детерминированных результатов.
Если маркер - это всего лишь одна таблица, я не уверен, что индексированное представление будет иметь какое-либо преимущество в производительности по сравнению собычное представление для таблицы с тем же кластеризованным индексом в базовой таблице (ReadTime, EquipmentID)
Однако, если «Маркер» сам по себе является составным, например VIEW
, ИЛИ, если вы не хотитеизмените кластеризованный индекс в таблице маркеров, тогда вы можете рассмотреть что-то вроде:
- Создать представление с привязкой к схеме без фильтра ReadDate (vwMarker)
- Создать индексированное представление на нефильтрованномview
- Создайте второе не привязанное к схеме представление vwMarkerRecent или подобное, которое добавляет недетерминированный фильтр
GetDate
.
Пример Sql Fiddle здесь
т.е. что-то вроде:
CREATE VIEW [Cic].[vwMarker] WITH SCHEMABINDING
AS
Select
SubId,
marker.EquipmentID,
marker.ReadTime,
marker.CdsLotOpside,
marker.CdsLotBackside,
marker.CdteLotOpside,
marker.CdTeLotBackside
From dbo.Marker
-- Add only Deterministic where filters here
GO
CREATE UNIQUE CLUSTERED INDEX IX_vwMarker ON Cic.vwMarker (ReadTime, EquipmentID)
GO
CREATE VIEW [Cic].[vwRecentMarker] -- Not Schema Bound
AS
Select
vm.SubId,
vm.EquipmentID,
vm.ReadTime,
vm.CdsLotOpside,
vm.CdsLotBackside,
vm.CdteLotOpside,
vm.CdTeLotBackside
From cic.vwMarker vm
Where vm.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120)
GO