এসকিউএল সার্ভারে 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 ব্যবহার করা ভাল অনুশীলন যাতে এসকিউএল সার্ভারকে কোনও ত্রুটি পরিচালনা করতে না হয় যার জন্য আরও সময় এবং সংস্থান প্রয়োজন।
এই ধরণের কোডের জন্য একটি ক্রিয়াকলাপটি ক্যোয়ারিতে কেবল একই যুক্তি ব্যবহার করার চেয়ে বেশি ওভারহেড বহন করবে, সুতরাং এটি যদি প্রতি সেকেন্ডে বহুবার বলা হয় তবে আপনি এটির জন্য কোনও ফাংশন ব্যবহার করে গুরুত্বপূর্ণ উত্সটিকে চিবিয়ে নিতে পারেন। আমি বুঝতে পারি যে এটি কোডের অসংখ্য টুকরোগুলি থেকে কল করা যেতে পারে তাই ডিফল্ট তারিখ পরিবর্তন করার প্রয়োজনে এটি একটি ফাংশন করার ইচ্ছা আছে - তবে এটি কোনও সংকলিত কোড পরিবর্তন করে না এবং কেবল এই ফাংশনটি আপডেট করে।
যদি এই কোডটি প্রচুর পরিমাণে চালিত হতে চলেছে তবে আপনার অন্যান্য বিকল্পগুলি বিবেচনা করা উচিত যা ব্যবহারকারী-সংজ্ঞায়িত ফাংশনের চেয়ে আরও ভাল কার্য সম্পাদন করবে performance আপনার বিকল্পগুলির সংক্ষিপ্তসার এবং আপনি কেন অন্যগুলির মধ্যে একটি বেছে নিতে পারেন তার আরও ব্যাখ্যাের জন্য দয়া করে সলোমন এর উত্তর দেখুন ।
উদাহরণস্বরূপ, নিম্নলিখিতটি একটি ইনলাইন টেবিল-মূল্যবান ফাংশন হিসাবে প্রয়োগ করা একই যুক্তি দেখায়, যা CROSS APPLY
কোনও স্ট্যাটিক মান সরবরাহ না করা হলে এটি ব্যবহার করা প্রয়োজন , তবে একটি স্কেলার ইউডিএফের তুলনায় আরও ভাল সম্পাদন করে:
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
*/