একটি সিটিই কেন একটি আধা-কোলন দিয়ে শুরু করা উচিত?


14

আমি কেবল স্ট্যাকওভারফ্লোতে একটি পোস্ট দেখছিলাম যেখানে অ্যারন বার্ট্র্যান্ড একটি সংখ্যা সারণির পরিবর্তে সিটিই ব্যবহার করার প্রস্তাব করেছিল, যা হাতের কাজটি সম্পাদন করার একটি মার্জিত উপায়। আমার প্রশ্ন, সিটিইর প্রথম লাইনটি কেন একটি আধা-কোলন দিয়ে শুরু হয়?

;WITH n AS (SELECT TOP (10000) n FROM 
  (SELECT n = ROW_NUMBER() OVER
    (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
  ) AS x ORDER BY n
)
SELECT n FROM n ORDER BY n; -- look ma, no gaps!

এটি কি WITH বিবৃতিটি পূর্বের SELECTবা কোনও কিছুর মধ্যে বিভক্ত হয় না তা নিশ্চিত করার জন্য ? আমি এসকিউএল সার্ভার 2005 বিএল-তে কিছুই দেখতে পাচ্ছি না তার সাথে আগে আধা-কোলন ব্যবহার করার বিষয়ে।


উত্তর:


26

এখানে বা স্ট্যাকওভারফ্লোতে পোস্ট করার সময় আমি সর্বদা এটি করি কারণ WITHযেহেতু মূলশব্দটি অতিরিক্ত বোঝা হয়ে গেছে - পূর্ববর্তী কমান্ডটির একটি সমাপ্তি আধিকারিক-কোলোন প্রয়োজন। আমি যদি কোনও কোডের নমুনা সিস্টি ব্যবহার করি যা অনিবার্যভাবে কিছু ব্যবহারকারী তাদের বিদ্যমান কোডে এটি পেস্ট করবে এবং পূর্ববর্তী বিবৃতিতে আধা-কোলন থাকবে না। সুতরাং কোডটি ভেঙে যায় এবং আমি যেমন অভিযোগ পেয়েছি:

আপনার কোড ভঙ্গ! আমি এই ত্রুটি বার্তা পেয়েছি:

Incorrect syntax near 'WITH'...

যদিও আমি বিশ্বাস করতে চাই যে লোকেরা সবসময় তাদের বক্তব্যকে একটি আধা-কোলনের সাথে সমাপ্ত করার বিষয়ে আরও ভাল হয়ে উঠছে , আমি বরং গোলমালটি প্রাক-শূন্য করে দিয়েছি এবং সর্বদা এটি অন্তর্ভুক্ত করব। কিছু লোক এটি পছন্দ করে না, তবে <shrug />। আপনি যে কোনও বৈধ বিবৃতি চান তার আগে বা পরে যতগুলি আধা-কলোন অন্তর্ভুক্ত করতে পারেন। এটি বৈধ:

;;;;SELECT 1;;;;;;;;;;;;SELECT 2;;;;;;;;SELECT 3;;;;;

সুতরাং সংজ্ঞায়িতভাবে এটির প্রয়োজনীয়তার বিবৃতি দেওয়ার আগে অতিরিক্ত আধো-কোলন থাকার কোনও ক্ষতি নেই। এটি এত সুন্দর না হলেও এটি করা নিরাপদ।

পয়েন্টটি পেরিয়ে যাওয়ার জন্য এটি অদ্ভুতভাবে বলতে হবে, তবে "অর্ধ-কোলনের সাথে একটি বৈধ বিবৃতি না শেষ করা" আসলে এসকিউএল সার্ভার ২০০৮ সাল থেকে অবচয় করা হয়েছে So এটি একটি ত্রুটি বাইপাস করা প্রয়োজন হয় না, এটি বৈধ যেখানেই ব্যবহার করা উচিত। আপনি এটি এখানে দেখতে পারেন:

http://msdn.microsoft.com/en-us/library/ms143729.aspx

("অর্ধ-কোলোন" এর জন্য শেষ পৃষ্ঠাটি অনুসন্ধান করুন)

ব্যতিক্রম না থাকলে অবশ্যই এটি এসকিউএল সার্ভার হত না। এটা চেষ্টা কর:

BEGIN TRY;
  SELECT 1/1;
END TRY;
BEGIN CATCH;
  SELECT 1/1;
END CATCH;

এটি নিয়মের একমাত্র ব্যতিক্রম নয়, তবে এটিই আমি সবচেয়ে সংবেদনশীল বলে মনে করি।


1
২০১২ সালেও আমি একই ত্রুটি বার্তাটি পাই, তবে কেবলমাত্র সেমি-কোলনের পরে END TRY: i.stack.imgur.com/rc6dw.png - আমি যদি সেমি-কোলন অপসারণ করি তবে সমস্ত কিছু কাজ করে।
অ্যারন বারট্রান্ড

আমি মনে করি আপনি BEGIN CATCHএটির আগে একটি অর্ধসীমা স্থাপন করতে পারবেন না কারণ এটি একটি একক যৌগিক বিবরণের অংশ BEGIN TRY। এটি IFবিবৃতি দেওয়ার আগে সেমিকোলন রাখার মতোই ELSE
অ্যান্ড্রি এম

@ অ্যান্ড্রিএম আমি এখানে বিধি সম্পর্কে আরও বিস্তারিত কথোপকথনের প্রাইভেট হয়েছি। আমি এটি উল্লেখ করেছি কারণ এটি জুড়ে আসা প্রত্যেকের জন্য এটি আশ্চর্যের কারণ, কারণটির কারণ আমি বুঝতে পারি না not :-)
অ্যারন বার্ট্র্যান্ড

10

এটি এটি কোনও পূর্ববর্তী বিবৃতিতে অন্তর্ভুক্ত না হওয়ার WITHকারণে এটি টি-এসকিউএল বিভিন্ন উদ্দেশ্য পূরণ করতে পারে to

এটি যদি ব্যাচের প্রথম বিবৃতি হয় তবে আমি মনে করি না এটি আপনার প্রয়োজন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.