SQL Server-создание индексированного представления, связанного со схемой, с текущим фильтром GetDate
Я хочу создать следующее индексированное представление:
CREATE VIEW [Cic].[vwMarker] WITH SCHEMABINDING
AS
Select
SubId,
marker.EquipmentID,
marker.ReadTime,
marker.CdsLotOpside,
marker.CdsLotBackside,
marker.CdteLotOpside,
marker.CdTeLotBackside
From dbo.Marker
Where dbo.Marker.ReadTime >= Convert(dateTime,'10/5/2011',120)
GO
CREATE UNIQUE CLUSTERED INDEX IX_vwMarker_ReadTime_EquipmentID
ON Cic.vwMarker (ReadTime, EquipmentID);
это прекрасно работает. Однако то, что я действительно хотел бы сделать, - это включить в это представление только строки двухдневной давности или новее, начиная с текущей даты/времени запроса представления. Я не могу найти способ сделать это, потому что я не могу использовать GetDate() в предикате Where, потому что он недетерминирован. Другими словами, Я хотел бы сделать что-то подобное, но не могу:
Where dbo.Marker.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120)
есть ли способ обойти это?
1 ответов
AFAIK вы не собираетесь обойти детерминированную функцию для требования SCHEMABINDING. Вы всегда будете получать сообщение об ошибке
функции 'функции getdate' недетерминированные результаты. Используйте детерминированную системную функцию или измените пользовательскую функцию для возврата детерминированных результатов.
если маркер - это только одна таблица, я не уверен, что индексированное представление будет иметь какое-либо преимущество по сравнению с обычным представлением против таблицы с тем же кластеризованным индексом в базовой таблице (ReadTime, EquipmentID)
однако, если "маркер" сам по себе является составным, таким как VIEW
, или если вы не хотите изменять кластеризованный индекс в таблице маркеров, вы можете рассмотреть что-то вроде:
- создать привязан к схеме без фильтра ReadDate (vwMarker)
- создайте индексированное представление на нефильтрованном представлении
- создайте второй, не связанный со схемой вид vwMarkerRecent или такой, что добавляет в недетерминированный .
то есть что-то вроде:
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