यह वाक्य रचना कैसे काम करती है? {fn कर्डेट ()} या {एफएन नाउ ()} आदि


19

हाल ही में मैं कुछ काफी पुरानी संग्रहीत प्रक्रियाओं के माध्यम से देख रहा हूं जो SQL Server 2005 के लिए लिखे गए थे, और मैंने कुछ ऐसा देखा है जो मुझे समझ में नहीं आता है। यह किसी प्रकार का फंक्शन कॉल प्रतीत होता है।

एक नमुना:

SELECT o.name, o.type_desc, o.create_date
FROM sys.objects o
WHERE o.create_date < {fn Now()} -1;

यह उन सभी पंक्तियों को प्रदर्शित करेगा sys.objects, जिनकी create_dateपूर्व 24 घंटे से पहले हो।

यदि मैं इस क्वेरी के लिए निष्पादन योजना प्रदर्शित करता हूं, तो मुझे लगता है कि {fn Now()}इसे getdate()डेटाबेस इंजन द्वारा बदल दिया गया है:

SELECT [o].[name],[o].[type_desc],[o].[create_date] 
FROM [sys].[objects] [o] 
WHERE [o].[create_date]<(getdate()-@1)

स्पष्ट रूप से, का उपयोग {fn Now()}करना कहीं अधिक है GetDate()। मैं एक के लिए प्लेग की तरह इस वाक्यविन्यास से बचूंगा क्योंकि यह अनिर्दिष्ट है।

जवाबों:


25

यह ODBC एस्केप सिंटैक्स है, और इंजन जानता है कि इसका अपना कार्यान्वयन क्या है, और इसे स्वैप करता है, जैसा कि आपने निष्पादन योजना में देखा है। अन्य चीजें भी हैं, जैसे:

SELECT {fn curdate()},
       {ts '2016-05-24 15:19:36'}, -- not vulnerable to SET LANGUAGE!
       {guid 'D08891B4-BC25-4C7C-BAEF-3B756055AC6E'};

दस्तावेज़ देखें यहाँ , यहाँ , यहाँ सबसे महत्वपूर्ण बात, और यहाँ । लेकिन कृपया इस वाक्यविन्यास के बारे में जांच और सीख न लें; IMHO आपको अधिकांश भाग के लिए मूल सिंटैक्स का उपयोग करना चाहिए और दिखावा करना चाहिए कि आपने इस सामान के बारे में कभी नहीं सुना है।

मैं getdate()-1शॉर्टहैंड के खिलाफ भी दृढ़ता से अनुशंसा करता हूं , खासकर, यदि आप वापस जा रहे हैं और पुराने कोड को अपडेट कर रहे हैं। स्पष्ट और उपयोग करें DATEADD, क्योंकि निहित शॉर्टहैंड नए प्रकारों के साथ काम नहीं करता है। उदाहरण के लिए, कोशिश करें:

DECLARE @d DATE = GETDATE();
SELECT @d - 1;

परिणाम:

Msg 206, लेवल 16, स्टेट 2, लाइन 2
ऑपरेंड टाइप क्लैश: तारीख इंट के साथ असंगत है

जब आप वहां होते हैं, तो आप अर्ध-कॉलन को भी जोड़ सकते हैं, भले ही आप वास्तव में भविष्य में अपने कोड को 10 साल की रक्षा करना चाहते हों।


यह एस्केप सिंटैक्स JDBC द्वारा भी समर्थित है।
a_horse_with_no_name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.