ওয়েবে কিছু কোড এবং এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর দ্বারা নির্মিত স্ক্রিপ্টগুলি পরীক্ষা করার সময় আমি লক্ষ্য করেছি যে কিছু বিবৃতি একটি সেমিকোলন দিয়ে শেষ হয়েছে।
সুতরাং আমি কখন এটি ব্যবহার করব?
ওয়েবে কিছু কোড এবং এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর দ্বারা নির্মিত স্ক্রিপ্টগুলি পরীক্ষা করার সময় আমি লক্ষ্য করেছি যে কিছু বিবৃতি একটি সেমিকোলন দিয়ে শেষ হয়েছে।
সুতরাং আমি কখন এটি ব্যবহার করব?
উত্তর:
কেন পাওয়ারের একটি এসকিউএল সার্ভারসেন্ট্রাল.কম নিবন্ধ থেকে :
সেমিকোলন
সেমিকোলন চরিত্রটি একটি বিবৃতি টার্মিনেটর। এটি এএনএসআই এসকিউএল -২৯ স্ট্যান্ডার্ডের একটি অংশ, তবে লেনদেন-এসকিউএল-এর মধ্যে কখনও ব্যবহৃত হয়নি। আসলে, কখনও কখনও কোনও সেমিকোলনের মুখোমুখি না হয়ে টি-এসকিউএল কোড করা সম্ভব হয়েছিল।
ব্যবহার
দুটি পরিস্থিতি রয়েছে যেখানে আপনাকে অবশ্যই সেমিকোলনটি ব্যবহার করতে হবে। প্রথম পরিস্থিতিটি যেখানে আপনি একটি সাধারণ টেবিল এক্সপ্রেশন (সিটিই) ব্যবহার করেন এবং সিটিই ব্যাচের প্রথম বিবৃতি নয়। দ্বিতীয়টি যেখানে আপনি পরিষেবা ব্রোকারের বিবৃতি দেন এবং পরিষেবা ব্রোকারের বিবৃতি ব্যাচের প্রথম বিবৃতি নয়।
THROW
কোনো পরিষেবার ব্রোকার বক্তব্য? এই উদাহরণে নিক্ষেপ করার আগে আমাদের একটি আধা-কোলন অন্তর্ভুক্ত করতে হবে:BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
MERGE
খুব উদাহরণস্বরূপ)। অন্যান্য
ডিফল্টরূপে, এসকিউএল স্টেটমেন্টগুলি সেমিকোলন দিয়ে সমাপ্ত হয়। আপনি স্টেটমেন্টটি বন্ধ করতে একটি সেমিকোলন ব্যবহার করেন যদি না আপনি (খুব কম) নতুন স্টেটমেন্ট টার্মিনেটর সেট করেন set
আপনি যদি কেবল একটি বিবৃতি প্রেরণ করেন তবে প্রযুক্তিগতভাবে আপনি বিবৃতি টার্মিনেটরের সাথে সরবরাহ করতে পারেন; একটি স্ক্রিপ্টে, আপনি যেমন একাধিক বিবৃতি প্রেরণ করছেন, আপনার এটির প্রয়োজন।
অনুশীলনে, সর্বদা টার্মিনেটর অন্তর্ভুক্ত করুন এমনকি যদি আপনি কেবল ডেটাবেসে একটি বিবৃতি প্রেরণ করেন।
সম্পাদনা করুন: তাদের বক্তব্যগুলির জবাবে টার্মিনেটরগুলির [বিশেষত আরডিবিএমএস] প্রয়োজন হয় না, যদিও এটি সত্য হতে পারে, এএনএসআই এসকিউএল স্ট্যান্ডার্ড দ্বারা তাদের প্রয়োজনীয়। সমস্ত প্রোগ্রামিংয়ে, যদি আমরা কার্যকারিতা না হারিয়ে কোনও স্ট্যান্ডার্ড মেনে চলতে পারি তবে আমাদের উচিত, কারণ তখন আমাদের কোড বা আমাদের অভ্যাসগুলি কোনও মালিকানাধীন বিক্রেতার সাথে আবদ্ধ নয়।
কিছু সি সংকলক দিয়ে, মূল রিটার্নটি শূন্য হওয়া সম্ভব, যদিও স্ট্যান্ডার্ডের কাছে মেটা ইন্ট ফেরার প্রয়োজন হয়। তবে এটি করা আমাদের কোডকে এবং নিজেরাই কম বহনযোগ্য makes
কার্যকরভাবে প্রোগ্রামিংয়ের বৃহত্তম অসুবিধাটি নতুন জিনিস শিখছে না, এটি খারাপ অভ্যাসটি প্রকাশ করছে। প্রথমদিকে খারাপ অভ্যাস অর্জন করা যে পরিমাণে আমরা এড়াতে পারি, এটি আমাদের পক্ষে, আমাদের কোডের জন্য, এবং যে কেউ আমাদের কোড পড়ছেন বা ব্যবহার করছেন তার পক্ষে এটি একটি জয়।
এসকিউএল ২০০৮ বিএল-এ তারা বলেছে যে পরবর্তী প্রকাশে সেমিকোলনগুলির প্রয়োজন হবে। অতএব, সর্বদা এটি ব্যবহার করুন।
রেফারেন্স:
আপনার অবশ্যই এটি ব্যবহার করা উচিত ।
বিবৃতি সমাপ্ত করতে একটি সেমিকোলন ব্যবহারের অনুশীলন মানসম্মত এবং বাস্তবে অন্যান্য বেশ কয়েকটি ডাটাবেস প্ল্যাটফর্মের প্রয়োজন। এসকিউএল সার্ভারের কেবলমাত্র নির্দিষ্ট ক্ষেত্রে সেমিকোলন প্রয়োজন — তবে যে ক্ষেত্রে সেমিকোলন প্রয়োজন হয় না, সেগুলি ব্যবহার করে সমস্যা হয় না। আমি দৃ strongly়ভাবে প্রস্তাব দিচ্ছি যে আপনি একটি সেমিকোলন দিয়ে সমস্ত বিবৃতি বন্ধ করার অনুশীলন অবলম্বন করুন। এটি কেবল আপনার কোডের পঠনযোগ্যতার উন্নতি করবে না, তবে কিছু ক্ষেত্রে এটি আপনাকে কিছুটা দুঃখও বাঁচাতে পারে। (যখন একটি সেমিকোলন প্রয়োজন হয় এবং নির্দিষ্ট না করা হয়, এসকিউএল সার্ভারের ত্রুটি বার্তাটি সবসময় খুব পরিষ্কার থাকে না))
এবং সবচেয়ে গুরুত্বপূর্ণ:
এসকিউএল সার্ভার ডকুমেন্টেশন ইঙ্গিত দেয় যে টিম-এসকিউএল স্টেটমেন্টগুলিকে একটি সেমিকোলন দিয়ে শেষ না করা একটি অবচিত বৈশিষ্ট্য। এর অর্থ দীর্ঘমেয়াদী লক্ষ্যটি হল পণ্যটির ভবিষ্যতের সংস্করণে সেমিকোলনের ব্যবহার কার্যকর করা। আপনার সমস্ত বিবৃতি শেষ করার অভ্যাসে প্রবেশের এটি আরও একটি কারণ, যেখানে বর্তমানে এটির প্রয়োজনীয়তা নেই।
উত্স: মাইক্রোসফ্ট এসকিউএল সার্ভার ২০১২ টি-এসকিউএল ফান্ডামেন্টাল ইটজিক বেন-গান।
আপনাকে সর্বদা কেন ব্যবহার ;
করতে হবে তার একটি উদাহরণ হ'ল নিম্নলিখিত দুটি প্রশ্নের (এই পোস্ট থেকে অনুলিপি করা ):
BEGIN TRY
BEGIN TRAN
SELECT 1/0 AS CauseAnException
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
THROW
END CATCH
BEGIN TRY
BEGIN TRAN
SELECT 1/0 AS CauseAnException;
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE();
THROW
END CATCH
not using them
কৌশল হিসাবে আপনার ব্যবহার করা উচিত। তা না হলে ভবিষ্যতে ভোগার ঝুঁকি রয়েছে। আপনি যদি চাকরী আপগ্রেড / স্যুইচ করার পরিকল্পনা না করে থাকেন এবং সর্বদা এসকিউএল সার্ভার 2000 এর সাথে কাজ করতে যান তবে আপনি নিরাপদ :-)
Incorrect syntax near 'THROW'.
এসকিউএল সার্ভার ২০০৮ (10.0.6241.0) এ ফলাফল দেয় যা আমার কাজের সাথে কাজ করার সংস্করণ। এটি ২০১২-র মতো প্রদর্শিত হয়েছে। আমি অবজ্ঞার কারণে অর্ধপরিচয়গুলি ব্যবহার শুরু করার ব্যাপারে নিশ্চিত হয়েছি। আমি আশা করি না এটি বেশিরভাগ সময় ২০০৮ এ সমস্যা হবে।
আমি যদি এটি সঠিকভাবে পড়ে থাকি তবে টিএসকিউএল স্টেটমেন্টগুলি শেষ করতে সেমিকোলন ব্যবহার করা প্রয়োজন হবে। http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx
সম্পাদনা: আমি এসএসএমএস ২০০৮ আর ২ এর জন্য একটি প্লাগ-ইন পেয়েছি যা আপনার স্ক্রিপ্টটি ফর্ম্যাট করে এবং সেমিকোলনগুলি যুক্ত করবে। আমি মনে করি এটি এখনও বিটাতে রয়েছে ...
http://www.tsqltidy.com/tsqltidySSMSAddin.aspx
সম্পাদনা: আমি এপেক্সএসকিউএল নামে একটি আরও ভাল ফ্রি সরঞ্জাম / প্লাগইন পেয়েছি ... http://www.apexsql.com/
ব্যক্তিগত মতামত: যেখানে প্রয়োজন সেখানে এগুলি ব্যবহার করুন। (প্রয়োজনীয় তালিকার জন্য উপরে টিটিএক্সআইয়ের উত্তর দেখুন।)
যেহেতু সংকলকটি তাদের প্রয়োজন হয় না, আপনি সেগুলি পুরোপুরি রেখে দিতে পারেন তবে কেন? সংকলক আপনাকে কোনটি ভুলে গেছে তা আপনাকে জানায় না, তাই আপনি বেমানান ব্যবহারের সাথে শেষ করবেন।
[এই মতামত এসকিউএল সার্ভারের সাথে নির্দিষ্ট। অন্যান্য ডাটাবেসের আরও কঠোর প্রয়োজনীয়তা থাকতে পারে। আপনি যদি একাধিক ডাটাবেসে চালনার জন্য এসকিউএল লিখছেন তবে আপনার প্রয়োজনীয়তা আলাদা হতে পারে]]
tpdi উপরে বর্ণিত হয়েছে, "একটি স্ক্রিপ্টে, আপনি একাধিক বিবৃতি প্রেরণ করছেন, আপনার এটির দরকার আছে।" এটি আসলে সঠিক নয়। আপনার তাদের দরকার নেই।
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';
আউটপুট:
Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional
টি-এসকিউএল সম্পর্কে আমার এখনও অনেক কিছু শিখতে হবে, তবে লেনদেনের জন্য কিছু কোড তৈরি করার ক্ষেত্রে (এবং স্ট্যাকওভারফ্লো এবং অন্যান্য সাইটগুলির উদাহরণগুলির ভিত্তিতে কোড ভিত্তিক কোড) আমি একটি কেস পেয়েছি যেখানে এটি মনে হয় যে সেমিকোলন প্রয়োজন এবং এটি অনুপস্থিত থাকলে, বিবৃতিটি মোটেও কার্যকর হচ্ছে বলে মনে হয় না এবং কোনও ত্রুটি উত্থাপিত হয় না। এটি উপরের উত্তরের কোনওটিতে আচ্ছাদিত বলে মনে হচ্ছে না। (এটি এমএস এসকিউএল সার্ভার 2012 ব্যবহার করছিল))
একবার আমি যেমনভাবে নিজের মতো লেনদেন করেছি, তখন আমি তার চারপাশে একটি ট্রাই-ক্যাচ রাখার সিদ্ধান্ত নিয়েছি যাতে যদি কোনও ত্রুটি থাকে তবে এটি আবার ঘূর্ণায়মান। কেবল এটি করার পরে, লেনদেনটি প্রতিশ্রুতিবদ্ধ হয়নি (এসএমএসএস একটি অনুরুপিত লেনদেন রয়েছে তা সম্পর্কে আপনাকে সতর্ক করে একটি দুর্দান্ত বার্তা দিয়ে উইন্ডোটি বন্ধ করার চেষ্টা করার সময় এটি নিশ্চিত করে।
আমার স্নাতকের
COMMIT TRANSACTION
কোনও BEGIN TRY / End এর বাইরে ট্রায়ার ব্লক লেনদেন করার জন্য ভাল কাজ করেছে, তবে ব্লকের ভিতরে এটি হতে হয়েছিল
COMMIT TRANSACTION;
নোট করুন যে কোনও ত্রুটি বা সতর্কতা সরবরাহ করা হয়নি এবং কোয়েরি ট্যাবটি বন্ধ করার চেষ্টা না করা অবধি লেনদেনটি এখনও অনিয়ন্ত্রিত রয়েছে এমন কোনও ইঙ্গিত নেই।
ভাগ্যক্রমে এটি এত বিশাল সমস্যা সৃষ্টি করে যে এটি তাত্ক্ষণিকভাবে স্পষ্ট হয় যে কোনও সমস্যা আছে। দুর্ভাগ্যক্রমে যেহেতু কোনও ত্রুটি (সিনট্যাক্স বা অন্যথায়) রিপোর্ট করা হয়নি ততক্ষণে সমস্যাটি কী তা তাত্ক্ষণিকভাবে স্পষ্ট হয় নি।
বিপরীতে, রোলব্যাক ট্রান্সাকশনটি সেমিকোলনের সাথে বা ছাড়াই বিগইন ক্যাচ ব্লকে সমানভাবে কাজ করে বলে মনে হচ্ছে।
এটিতে কিছু যুক্তি থাকতে পারে তবে এটি নির্বিচারে এবং অ্যালিস-ইন-ওয়ান্ডারল্যান্ড-ইশ অনুভব করে।
COMMIT TRANSACTION
anচ্ছিক লেনদেন / সেভ পয়েন্টের নাম গ্রহণ করে (যা এটি উপেক্ষা করবে)। একটি সমাপ্তি সেমিকোলন ব্যতীত COMMIT TRANSACTION
পরবর্তী চিহ্নটি খেতে পারেন যদি এটি সনাক্তকারী হিসাবে পার্স করে, যা কোডের শব্দার্থকে আমূল পরিবর্তন করতে পারে। যদি এটির পরে কোনও ত্রুটির ফলস্বরূপ ঘটে CATCH
তবে COMMIT
কখনও কখনও মৃত্যুদণ্ড কার্যকর না করে ট্রিগারটি ট্রিগার করতে পারে । বিপরীতভাবে, ROLLBACK TRANSACTION
এছাড়াও এই যেমন একটি alচ্ছিক শনাক্তকারী গ্রহণ করার সময়, পার্সিংয়ের ক্ষেত্রে একটি ত্রুটির ফলে লেনদেনটি যেভাবেই আবার ফিরে যেতে পারে সম্ভবত।
দেখা যাচ্ছে যে সেমিকোলন কার্সার অপারেশন সাথে ব্যবহার করা উচিত: OPEN
, FETCH
, CLOSE
এবং DEALLOCATE
। আমি এই সঙ্গে কয়েক ঘন্টা নষ্ট। বিএল-এর দিকে আমার গভীর নজর ছিল এবং লক্ষ্য করা গেল যে [;] এই কার্সার বিবৃতিগুলির সিনট্যাক্সে দেখানো হয়নি !!
সুতরাং আমি ছিল:
OPEN mycursor;
এবং এটি আমাকে ত্রুটি দিয়েছে 16916।
কিন্তু:
OPEN mycursor
কাজ করছে.
মতে লেনদেন এসকিউএল সিনট্যাক্স কনভেনশন (লেনদেন এসকিউএল) (দুটিই MSDN)
লেনদেন-এসকিউএল স্টেটমেন্ট টার্মিনেটর। যদিও এসকিউএল সার্ভারের এই সংস্করণে বেশিরভাগ বিবৃতিগুলির জন্য সেমিকোলন প্রয়োজন হয় না তবে এটি ভবিষ্যতের সংস্করণে প্রয়োজন হবে।
(@ জিরিলাউরির মন্তব্যও দেখুন)
কোনও ব্যাচে যে কোনও অক্ষম বা সক্ষম ট্রিগার বিবৃতিতে অন্যান্য বিবৃতি রয়েছে সেগুলি ব্যবহার করার সময়, বিবৃতিটি সেমিকোলনের সাথে শেষ হওয়া উচিত। অন্যথায়, আপনি একটি সিনট্যাক্স ত্রুটি পাবেন। আমি এইটি দিয়ে আমার চুল ছিঁড়ে ফেলেছি ... এবং পরে, আমি একই জিনিসটি নিয়ে এই এমএস কানেক্ট আইটেমটিতে হোঁচট খেয়েছি। এটি ঠিক না হওয়ায় এটি বন্ধ রয়েছে।
দেখতে এখানে
দ্রষ্টব্য: এটি লিখিত হিসাবে প্রশ্নের উত্তর দেয়, তবে উল্লিখিত সমস্যাটি নয়। এটি এখানে যুক্ত করা হচ্ছে, যেহেতু লোকেরা এটি অনুসন্ধান করবে
WITH
পুনরাবৃত্ত সিটিই বিবৃতিতে এর আগেও সেমিকোলন ব্যবহৃত হয় :
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
এই কোয়েরিটি পূর্ণসংখ্যার [1..10] সমন্বিত নাম্বার নামক একটি সিটিই তৈরি করবে। এটি কেবলমাত্র 1 টি মান সহ একটি টেবিল তৈরি করে এবং পরে 10 এ পৌঁছানো পর্যন্ত পুনরাবৃত্তি করে is
আপনি যদি এসকিউএল সার্ভারে এলোমেলোভাবে কমান্ড টাইমআউট ত্রুটি পেতে চান তবে আপনার কমান্ডটেক্সট স্ট্রিংয়ের শেষে আধা-কোলনটি ছেড়ে যান।
আমি জানি না এটি কোথাও নথিভুক্ত হয়েছে বা এটি কোনও বাগ থাকলেও তা ঘটে থাকে এবং আমি তিক্ত অভিজ্ঞতা থেকে এটি শিখেছি।
এসকিউএল সার্ভার 2008 ব্যবহার করে আমার যাচাইযোগ্য এবং পুনরুত্পাদনযোগ্য উদাহরণ রয়েছে।
ওরফে -> অনুশীলনে, সর্বদা টার্মিনেটর অন্তর্ভুক্ত করুন এমনকি যদি আপনি কেবল ডাটাবেসে একটি বিবৃতি প্রেরণ করেন।
সেমিকোলনগুলি সর্বদা যৌগিক SELECT বিবৃতিতে কাজ করে না।
একটি তুচ্ছ যৌগিক SELECT বিবৃতি এই দুটি পৃথক সংস্করণ তুলনা করুন।
কোড
DECLARE @Test varchar(35);
SELECT @Test=
(SELECT
(SELECT
(SELECT 'Semicolons do not always work fine.';);););
SELECT @Test Test;
আয়
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.
যাইহোক, কোড
DECLARE @Test varchar(35)
SELECT @Test=
(SELECT
(SELECT
(SELECT 'Semicolons do not always work fine.')))
SELECT @Test Test
আয়
Test
-----------------------------------
Semicolons do not always work fine.
(1 row(s) affected)