2011-10-07 30 views
6

我想創建以下索引視圖綁定到架構的索引視圖:SQL服務器 - 創建與當前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); 

這工作得很好。但是,我真正想要做的僅僅是在該視圖中包含兩天或更新的行,從視圖被查詢的當前日期/時間開始。我找不到這樣做的方法,因爲我無法在Where謂詞中使用GetDate(),因爲它是非確定性的。換句話說,我想做這樣的事情,但不能:

Where dbo.Marker.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120) 

有沒有辦法解決這個問題?

回答

11

AFAIK你不打算繞過SCHEMABINDING要求的確定性函數。您將始終收到錯誤

函數'getdate'產生不確定的結果。使用確定性系統函數,或修改用戶定義的函數以返回確定性結果。

如果標記只是一個單一的表,我不知道該索引視圖會有任何性能優勢與桌子正常視圖與(ReadTime, EquipmentID)

基礎表上相同的聚集索引但是,如果「標記」本身就是這樣一個複合的VIEW,或者如果你不想改變對標記表的聚集索引,那麼你可以考慮這樣的:

  • 創建模式約束圖沒有ReadDate過濾器(vwMarker)
  • 在未過濾視圖上創建索引視圖
  • 創建第二個不受架構限制的視圖vwMarkerRecent或其他,這會添加非確定性GetDate過濾器。

Sql Fiddle example here

即是這樣的:

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