এসকিউএল সার্ভারে আমার কখন বিগিন / এন্ড ব্লক এবং গো কীওয়ার্ড ব্যবহার করা দরকার?


103

এসকিউএল সার্ভারে কখন এবং কোথায় আমার ব্যবহার করা beginএবং endব্লক করা দরকার তা আমাকে বলতে পারে ?
এছাড়াও, Goকীওয়ার্ডটি ঠিক কী করে ?

উত্তর:


116

স্ক্রিপ্টের শেষের মতো G

আপনার কাছে একাধিক ক্রেট টেবিল বিবৃতি থাকতে পারে, যা জিও দ্বারা পৃথক। এটি স্ক্রিপ্টের একটি অংশকে অন্য থেকে আলাদা করার উপায়, তবে এটি সমস্ত একটি ব্লকে জমা দেওয়া।


বিগিন এবং সমাপ্তি C / ++ / #, জাভা ইত্যাদিতে ঠিক {এবং like এর মতো are

তারা কোডের একটি লজিকাল ব্লক আবদ্ধ। আমি একটি সঞ্চিত প্রক্রিয়া শুরু এবং শেষের দিকে BEGIN এবং END ব্যবহার করার ঝোঁক রাখি তবে সেখানে এটি কঠোরভাবে প্রয়োজনীয় নয়। এটি প্রয়োজনীয় যেখানে লুপগুলি, এবং যদি বিবৃতি ইত্যাদির জন্য হয় তবে যেখানে আপনার আরও এক ধাপ প্রয়োজন ...

IF EXISTS (SELECT * FROM my_table WHERE id = @id)
BEGIN
   INSERT INTO Log SELECT @id, 'deleted'
   DELETE my_table WHERE id = @id
END

আপনি কি কোনও বিগইন এবং শেষ না করে এসপি তৈরি করার চেষ্টা করেছেন? আইআইআরসি, কেবল প্রথম লাইনটি এসপিতে অন্তর্ভুক্ত করা হয়,
বাকীটি

2
এটি অবশ্যই এসকিউএল সার্ভার 2000 এর পরে আমার অভিজ্ঞতা নয়।
ম্যাটবাইলি

1
শুরু করুন এবং শেষগুলিও কি কোনও নতুন সুযোগকে সংজ্ঞায়িত করে?
সামিস

2
হ্যাঁ. বাইরে ঘোষিত যে কোনও কিছুই ভিতরে দৃশ্যমান, তবে এর ভিতরে ঘোষিত যে কোনও কিছুই এন্ডের বাইরে যাবে।
ম্যাটবাইলি

36

একাধিক স্টেটমেন্ট বিস্তৃত একটি ব্লক তৈরি করতে আপনার শুরু হওয়া দরকার ...। সুতরাং, যদি আপনি কোনও আইএফ স্টেটমেন্টের একটি 'লেগে' 2 টি জিনিস করতে চান, বা যদি আপনি একটি লুপের শরীরে একাধিক জিনিস করতে চান, আপনার এই বিবৃতিগুলি শুরু করুন BEGIN এর সাথে ... শেষ.

জিও কীওয়ার্ড এসকিউএল এর অংশ নয়। এটি কেবল অনুসন্ধান বিশ্লেষক দ্বারা স্ক্রিপ্টগুলি "ব্যাচে" বিভক্ত করতে ব্যবহৃত হয় যা স্বাধীনভাবে সম্পাদন করা হয়।


28

এসকিউএল সার্ভারে যান কীওয়ার্ড নয়; এটি একটি ব্যাচ বিভাজক। জিও বিবৃতি একটি ব্যাচ শেষ। আপনি এসকিউএলসিএমডি জাতীয় কিছু ব্যবহার করার সময় এটি বিশেষত কার্যকর। ভাবুন আপনি কমান্ড লাইনে এসকিউএল বিবৃতিতে প্রবেশ করছেন। প্রতিবার আপনি যখন কোনও বিবৃতি শেষ করেন তখন জিনিসটি কার্যকরভাবে চালানো উচিত নয়, সুতরাং এসকিউএল সার্ভার আপনার "জিও" প্রবেশ না করা পর্যন্ত কিছুই করে না।

তেমনি, আপনার ব্যাচটি শুরু হওয়ার আগে আপনার প্রায়শই কিছু জিনিস দৃশ্যমান হওয়া দরকার। উদাহরণস্বরূপ, ধরা যাক আপনি একটি ডাটাবেস তৈরি করছেন এবং তারপরে এটি অনুসন্ধান করছেন। আপনি লিখতে পারবেন না:

CREATE DATABASE foo;
USE foo;
CREATE TABLE bar;

কারন টেবিল তৈরি করে এমন ব্যাচের জন্য foo এর অস্তিত্ব নেই। আপনার এটি করা দরকার:

CREATE DATABASE foo;
GO
USE foo;
CREATE TABLE bar;

13

শুরু এবং অন্যদের দ্বারা অন্যদের দ্বারা ভাল উত্তর দেওয়া হয়েছে।

গ্যারি উল্লেখ করেছেন যে, জিও হ'ল একটি ব্যাচ বিভাজক, মাইক্রোসফ্ট সরবরাহ করা বেশিরভাগ ক্লায়েন্ট সরঞ্জাম যেমন ইস্কল, এসকিএলসিএমডি, ক্যোয়ারী অ্যানালাইজার এবং এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও দ্বারা ব্যবহৃত হয়। (কমপক্ষে কয়েকটি সরঞ্জাম ব্যাচের বিভাজককে পরিবর্তিত হতে দেয় I ব্যাচের বিভাজক পরিবর্তনের জন্য আমি কোনও ব্যবহার দেখিনি)

কখন জিও ব্যবহার করবেন এই প্রশ্নের উত্তর দেওয়ার জন্য, এসকিউএলকে কখন ব্যাচগুলিতে আলাদা করতে হবে তা জানতে হবে।

কিছু বিবৃতি অবশ্যই একটি ব্যাচের প্রথম বিবৃতি হতে হবে।

select 1
create procedure #Zero as
    return 0

এসকিউএল সার্ভার 2000 এ ত্রুটিটি হ'ল:

Msg 111, Level 15, State 1, Line 3
'CREATE PROCEDURE' must be the first statement in a query batch.
Msg 178, Level 15, State 1, Line 4
A RETURN statement with a return value cannot be used in this context.

এসকিউএল সার্ভার 2005 এ ত্রুটিটি কম সহায়ক:

Msg 178, Level 15, State 1, Procedure #Zero, Line 5
A RETURN statement with a return value cannot be used in this context.

সুতরাং, GOপৃথক বিবৃতিগুলি ব্যবহার করুন যা স্ক্রিপ্টে এর আগে থাকা বিবৃতিগুলি থেকে একটি ব্যাচের শুরু হতে হবে।

স্ক্রিপ্ট চালানোর সময়, অনেক ত্রুটি ব্যাচের কার্যকারিতা বন্ধ করে দেবে, তবে ক্লায়েন্ট কেবল পরবর্তী ব্যাচটি প্রেরণ করবে, স্ক্রিপ্টটির সম্পাদন থামবে না। আমি প্রায়শই পরীক্ষায় এটি ব্যবহার করি। আমি স্ক্রিপ্টটি শুরুর লেনদেনের সাথে শুরু করব এবং রোলব্যাকের সাথে শেষ করব, মাঝখানে সমস্ত পরীক্ষা করব:

begin transaction
go
... test code here ...
go
rollback transaction

এইভাবে আমি সর্বদা প্রারম্ভিক অবস্থানে ফিরে আসি, এমনকি যদি পরীক্ষার কোডে কোনও ত্রুটি ঘটে থাকে তবে পৃথক ব্যাচের অংশ হয়েও শুরু এবং রোলব্যাক লেনদেনের বিবৃতিগুলি এখনও ঘটে। যদি সেগুলি পৃথক ব্যাচে না থাকে, তবে একটি সিন্ট্যাক্স ত্রুটি লেনদেনটি ঘটতে শুরু করে, যেহেতু একটি ব্যাচ ইউনিট হিসাবে বিভক্ত হয়। এবং একটি রানটাইম ত্রুটিটি রোলব্যাকটি ঘটবে না।

এছাড়াও, যদি আপনি কোনও ইনস্টল স্ক্রিপ্ট করছেন এবং একটি ফাইলে বেশ কয়েকটি ব্যাচ রয়েছে তবে একটি ব্যাচের একটি ত্রুটি স্ক্রিপ্টটি চালিয়ে যাওয়া থেকে বিরত রাখবে না, যা কোনও বিশৃঙ্খলা ছেড়ে দিতে পারে। (ইনস্টল করার আগে সর্বদা ব্যাকআপ দিন))

ডেভ মার্কেল যেটি নির্দেশ করেছিলেন তার সাথে সম্পর্কিত, এমন কিছু ক্ষেত্রে রয়েছে যখন পার্সিং ব্যর্থ হবে কারণ এসকিউএল সার্ভারটি ব্যাচের আগে তৈরি হওয়া বস্তুর ডেটা অভিধানে সন্ধান করছে তবে কোনও বিবৃতি চালানোর আগে পার্সিং ঘটতে পারে। কখনও কখনও এটি একটি সমস্যা হয়, কখনও কখনও না। আমি একটি ভাল উদাহরণ সঙ্গে আসতে পারে না। তবে আপনি যদি কখনও 'এক্স উপস্থিত থাকেন না' ত্রুটিটি পান, যখন স্পষ্টতই সেই বিবৃতিটি ব্যাচে বিভক্ত হয়ে উপস্থিত হবে।

এবং একটি চূড়ান্ত নোট। লেনদেন ব্যাচ স্প্যান করতে পারেন। (উপরে দেখুন।) চলকগুলি ব্যাচগুলি স্প্যান করে না।

declare @i int
set @i = 0
go
print @i

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@i".

1
এটি আমার দরকার ছিল, ধন্যবাদ: "লেনদেন ব্যাচগুলিকে বিস্তৃত করতে পারে। পরিবর্তনশীল ব্যাচগুলি স্প্যান করে না।"
গ্যারি

3

কোনও ব্যাচ শেষ করুন, আপনার কোডটি খুব কমই ব্যবহার করা দরকার। সচেতন থাকুন যে আপনি যদি এটি কোনও সঞ্চিত তদন্তে ব্যবহার করেন তবে আপনি যখন প্রক্ট চালাবেন তখন জিওর পরে কোনও কোড কার্যকর হবে না।

কোডের বহুগুণিত লাইনের সাথে প্রক্রিয়াগত ধরণের বিবৃতিগুলির জন্য বিগইন এবং শেষের প্রয়োজন are আপনার WHIP লুপ এবং কার্সারগুলির জন্য এটি প্রয়োজন হবে (যা অবশ্যই আপনি যদি এগুলি এড়াতে পারেন তবে অবশ্যই) এবং যদি বিবৃতিগুলি (ভাল প্রযুক্তিগতভাবে আপনার যদি আইএফ স্ট্যাটমেন্টের প্রয়োজন হয় না তবে কেবল কোডের একটি লাইন থাকে তবে এটি সহজতর হয়) কোডটি বজায় রাখুন যদি আপনি সর্বদা তাদের আইএফ-এর পরে রাখেন)) CASE স্টেটমেন্টগুলিতে একটি এন্ডও ব্যবহার করা হয় তবে একটি শুরু হয় না।


GO এর পরে কোনও কোড আসলে স্টোরড প্রোকের বিপরীতে স্টোর হয়ে যাবে? ক্রেট বা অলটার স্টেটমেন্টটি জিএস-এর পরে কোড নেই বলে এমনভাবে প্রক্রিয়া করা হবে না? এবং তারপরে যাওয়ার পরে কোডটি কার্যকর করা হবে যেন এটি তার নিজস্ব স্ক্রিপ্ট?
ম্যাটবাইলি

এর সাথে কার্সারগুলি কী করেছে?
গ্যারি ম্যাকগিল 21

3

এই সমস্যাটির সাথে লড়াই করার পরে আজ আমার মতামতটি হ'ল: শুরু ... বন্ধনী কোডগুলি ঠিক rac .... like সি ভাষায় করে, যেমন কোড ব্লকগুলি যদি ... অন্যটি এবং লুপগুলি করে

পূর্ববর্তী বিবৃতি দ্বারা সংজ্ঞায়িত কোনও অবজেক্টের উপর সাফল্য অর্জনকারী বিবৃতি নির্ভর করে তখন অবশ্যই ব্যবহার করা উচিত be ইউএসই ডাটাবেস উপরে একটি ভাল উদাহরণ, কিন্তু নিম্নলিখিত এছাড়াও আপনাকে কামড় দেবে:

alter table foo add bar varchar(8);
-- if you don't put GO here then the following line will error as it doesn't know what bar is.
update foo set bar = 'bacon';
-- need a GO here to tell the interpreter to execute this statement, otherwise the Parser will lump it together with all successive statements.

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

কেন এটি কেবলমাত্র অর্ধ-কোলনকে একটি শব্দার্থ বিরতি হিসাবে বিবেচনা করে না এবং স্বতন্ত্রভাবে বিবৃতি প্রয়োগ করে আমি জানি না এবং এটি করতে ইচ্ছা করি না। কেবলমাত্র আমি দেখতে পাচ্ছি বোনাসটি হ'ল আপনি GO এর ঠিক আগে একটি মুদ্রণ () বিবৃতি দিতে পারেন এবং যদি বিবৃতিগুলির কোনওটি ব্যর্থ হয় তবে মুদ্রণটি কার্যকর হবে না। অল্প কিছু লাভের জন্য যদিও অনেক ঝামেলা।

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