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 или такой, что добавляет в недетерминированный .

пример скрипки Sql здесь

то есть что-то вроде:

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