SQL सर्वर 2012 पर और बाद में आप यह देखने के लिए TRY_CONVERT का उपयोग कर सकते हैं कि क्या इनपुट परिवर्तित किया जा सकता है। यदि यह नहीं हो सकता है, तो एक पूर्ण मान लौटाया जाता है, तब आप परिवर्तित मूल्य या निश्चित तिथि प्राप्त करने के लिए एक COALESCE कर सकते हैं।
begin
declare @result date
set @result = COALESCE(TRY_CONVERT(date, @date, 111), '2012-01-01')
return @result
end
आप TRY CATCH
ब्लॉक का उपयोग भी कर सकते हैं और ब्लॉक में निर्धारित तारीख को वापस कर सकते हैं CATCH
, लेकिन TRY_CONVERT का उपयोग करना सबसे अच्छा अभ्यास है ताकि SQL सर्वर को एक त्रुटि को संभालने की आवश्यकता न हो क्योंकि इसके लिए अधिक समय और संसाधनों की आवश्यकता होती है।
इस प्रकार के कोड के लिए एक फ़ंक्शन क्वेरी में एक ही तर्क का उपयोग करने की तुलना में अधिक ओवरहेड को उकसाएगा, इसलिए यदि इसे हर सेकंड कई बार कहा जा रहा है, तो आप इसके लिए फ़ंक्शन का उपयोग करके महत्वपूर्ण संसाधन चबा सकते हैं। मैं समझता हूं कि इसे कोड के कई टुकड़ों से बुलाया जा सकता है, इसलिए डिफ़ॉल्ट तिथि को बदलने की आवश्यकता होने पर इसे एक फ़ंक्शन बनाने की इच्छा होती है - फिर यह कोई संकलित कोड परिवर्तन नहीं है और बस इस फ़ंक्शन को अपडेट करें।
यदि यह कोड बहुत अधिक चलने वाला है, तो आपको अन्य विकल्पों पर विचार करना चाहिए जो उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन की तुलना में बेहतर प्रदर्शन प्रदान करेंगे। कृपया अपने विकल्पों के अवलोकन के लिए सोलोमन के उत्तर को देखें और इस बारे में और स्पष्टीकरण दें कि आप एक से दूसरे को क्यों चुन सकते हैं।
उदाहरण के लिए, निम्न इनलाइन टेबल-वैल्यू फ़ंक्शन के रूप में लागू किए गए तर्क को दिखाता है, जिसे CROSS APPLY
स्थैतिक मूल्य के साथ आपूर्ति नहीं किए जाने की आवश्यकता होती है , लेकिन एक स्केलर UDF की तुलना में बहुत बेहतर प्रदर्शन करता है:
USE [tempdb];
GO
CREATE
OR ALTER -- comment out if using pre-SQL Server 2016 SP1
FUNCTION dbo.ReturnDate (@Date VARCHAR(8))
RETURNS TABLE
AS RETURN
SELECT ISNULL(TRY_CONVERT(DATE, @Date, 111), '2020-01-01') AS [TheDate];
GO
SELECT *
FROM (VALUES (1, '20120101'), (2, '2012ABCD')) tab(ID, Input)
CROSS APPLY dbo.ReturnDate(tab.[Input]) dt
/*
ID Input TheDate
1 20120101 2012-01-01
2 2012ABCD 2020-01-01
*/