একটি অক্ষর ইনপুট এবং ফেরতের তারিখের ফর্ম্যাট (ভুল ইনপুট সহ) পাওয়ার জন্য ফাংশন


9

স্ট্রিং চরিত্রটি পেতে এবং তারিখের ফর্ম্যাটটি ফিরিয়ে দিতে আমার একটি ফাংশন লিখতে হবে। উদাহরণস্বরূপ ইনপুটটি 20120101 এবং আমার এটি 2012-01-01 দরকার। সমস্যাটি হ'ল এই "2012ABCD" এর মতো কিছু ভুল ইনপুট থাকতে পারে। সেক্ষেত্রে আমি চাই 2020-01-01 এর মতো একটি নির্দিষ্ট তারিখটি ফাংশনটি ফিরিয়ে দেবে। আমি এখন পর্যন্ত যা লিখেছি তা হ'ল:

Create Function ReturnDate
(@date varchar(8))

Returns date

  as

    begin
       declare @result date

          set @result = (select convert(date , @date,111))
                if(@@ROWCOUNT>0) return @result
                 else return '2020-01-01'
       return @result
    end

এটি কাজ করে না এবং আমি ঠিক জানি না কীভাবে দ্বিতীয় অংশটি পরিচালনা করতে হবে (যখন ইনপুটটি ভুল থাকে)।


1
আমি আপনাকে সুপারিশ করতে পারি যে আপনি "ট্রানজ্যাক্ট-এসকিউএল সহ ডেটা ক্যোয়ারিং" পড়ুন যদি আপনি প্রচুর এসকিউএল প্রোগ্রামিং করে থাকেন তবে এই বইটি আপনাকে কীভাবে এই জাতীয় কোডিং করতে হবে তার মৌলিক বিষয়গুলি শেখাবে। amazon.com/Exam-70-761- জিজ্ঞাসা- ডেটা- ট্রান্স্যাক্ট- এসকিউএল-পুস্তক
টনি হিঙ্কল

1
আপনি কি yyyymmddফর্ম্যাটের জন্য কঠোরভাবে পার্সিং চান ?
ড্যান গুজম্যান

উত্তর:


9

এসকিউএল সার্ভারে 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
*/

6
তবে আমি কোয়েরিতে কেবল TRY_CONVERT ব্যবহার করব এবং এর জন্য একটি অকার্যকর স্কেলার ইউডিএফ ব্যবহারের সম্পূর্ণ ধারণাটি বাতিল করব ...
অ্যারন বারট্রান্ড

2
আমি সত্যিই রেপ পয়েন্টগুলির বিষয়ে চিন্তা করি না, সুতরাং এ জাতীয় ক্ষতির কারণে আমি এটি বলছি না, তবে সম্প্রদায়টি সুস্পষ্টভাবে সঠিক উত্তরকে ডাউনভোট করে সুবিধা করে না। ডাউনভোটিংয়ের পরিবর্তে একটি উত্তর লিখুন, আমার সম্পাদনা করুন বা কী কী পরিবর্তন করা উচিত তা সম্পর্কে একটি মন্তব্য দিন। ওপি একটি ফাংশন চেয়েছিল, এবং আমি বুঝতে পারি যে এটি সেরা সমাধান নাও হতে পারে তবে এটিই সমাধানের জন্য অনুরোধ করা হয়েছিল।
টনি হিঙ্কল

3
টনি: আমি ভোট দিয়েছি না, তবে আমি অবশ্যই একমত যে কেউ কারও পক্ষে কোনও মন্তব্যে যুক্তি প্রদান না করে বা তার যুক্তি সহ একটি বিদ্যমান মন্তব্য আপ-ভোটিংয়ের বাইরে ভোট দেওয়া উচিত নয়। এটি বলেছিল: 1)FINALLY টি-এসকিউএলে কোনও ব্লক নেই (আমার মনে হয় আপনি বোঝাতে চেয়েছিলেন CATCH)। 2) আপনার সম্ভবত উল্লেখ করা উচিত যে TRY_CONVERTএটি 2012 সালে শুরু হয়েছিল (কিছু লোকেরা প্রাক-এসকিউএল সার্ভার 2012-এ আটকে আছে)। 3) আপনি একটি ইনলাইন টিভিএফ বিবেচনা করেছেন? যাদের স্কেলার ইউডিএফগুলির মতো পারফরম্যান্স সমস্যা নেই।
সলোমন রুটজকি

1
@ টনিহিংকেল এই সম্পাদনাগুলি করার জন্য এবং আমার উত্তরের রেফারেন্সের জন্য ধন্যবাদ :) :) তবুও, আমি নিশ্চিত নই যে কত জন পাঠক ইউডিএফ যুক্তি দেখে এবং একটি ইনলাইন টিভিএফ আরও সফলভাবে আইটিভিএফ বাস্তবায়ন করতে পারে তা পড়তে লাফ দিতে সক্ষম হবেন। সুতরাং, আমি এগিয়ে গিয়েছিলাম এবং এটি আপনার উত্তর শেষে যুক্ত।
সলোমন রুটজকি

1
@ সলোমনরুতজকি ধন্যবাদ আমি সত্যই এসকিউএল বিকাশকারী নই তাই এটি এখনও আমার মাথার উপরে। হয়তো আমার এর মতো কিছু উত্তর দেওয়া উচিত নয়, তবে এটি একটি অসাধারণ শেখার সুযোগ।
টনি হিঙ্কল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.