2011-10-07 12 views
6

मैं निम्नलिखित अनुक्रमित दृश्य बनाना चाहते हैं के साथ एक स्कीमा बाउंड इंडेक्स्ड देखें बनाना:एसक्यूएल सर्वर - एक मौजूदा 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 dbo.Marker.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120) 

क्या इसके आसपास कोई रास्ता है?

उत्तर

11

AFAIK आप SCHEMABINDING आवश्यकता के लिए निर्धारिती फ़ंक्शन के आसपास नहीं जा रहे हैं। आपको हमेशा त्रुटि

फ़ंक्शन 'getdate' nondeterministic परिणाम उत्पन्न करता है। निर्धारिती परिणामों को वापस करने के लिए एक निर्धारित प्रणाली फ़ंक्शन का उपयोग करें, या उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन को संशोधित करें।

तो मार्कर सिर्फ एक मेज है, मुझे यकीन है कि एक अनुक्रमित दृश्य (ReadTime, EquipmentID)

की अंतर्निहित मेज पर एक ही क्लस्टर सूचकांक के साथ तालिका के लिए एक सामान्य दृश्य पर कोई प्रदर्शन लाभ होता नहीं कर रहा हूँ हालांकि, अगर "मार्कर" अपने आप में एक समग्र इस तरह के एक VIEW के रूप में है, या यदि आप मार्कर मेज पर क्लस्टर किया सूचकांक बदलने के लिए नहीं करना चाहते हैं, तो आप की तरह कुछ पर विचार हो सकता:

  • एक स्कीमा बाध्य दृश्य बनाएँ रीडडेट फ़िल्टर के बिना (vwMarker)
  • unfiltered दृश्य पर इंडेक्स किए गए दृश्य को बनाएं
  • एक दूसरा, गैर स्कीमा-बाउंड व्यू 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 
संबंधित मुद्दे