একটি "ব্যাচ" কী, এবং কেন ব্যবহার করা হয়?


134

আমি এমএসডিএন ইত্যাদি পড়েছি এবং পড়েছি ঠিক আছে, তাই এটি একটি ব্যাচের শেষের ইঙ্গিত দেয়।

কোন ব্যাচ সংজ্ঞা দেয়? যখন আমি একই সাথে সমস্ত চালানোর জন্য একগুচ্ছ স্ক্রিপ্টগুলিতে আটক করছি তখন কেন আমাকে যেতে হবে তা আমি দেখতে পাচ্ছি না।

আমি কখনই বুঝতে পারি না কেউ কি এটি আরও ভালভাবে ব্যাখ্যা করতে পারেন এবং যখন আমার এটি ব্যবহার করা প্রয়োজন (কতগুলি বা কোন ধরণের লেনদেনের পরে)?

উদাহরণস্বরূপ, এখানে প্রতিটি আপডেটের পরে আমার কেন দরকার হবে:

 UPDATE [Country]
   SET [CountryCode] = 'IL'
 WHERE code = 'IL'

 GO

 UPDATE [Country]
   SET [CountryCode] = 'PT'
 WHERE code = 'PT'


এফডাব্লুআইডাব্লু, মনে হয় যেন কোনও পরিবর্তনশীল ঘোষণার goপুনরায় সেট / সাফ করে দেয় declare @foo- আমি আপনাকে @foo ত্রুটিগুলি প্রকাশ করার দরকার ছিলাম, যতক্ষণ না আমি মন্তব্য করি go
জেএল পিয়েরেট

উত্তর:


107

GOহয় না সঠিকভাবে একটি TSQL কমান্ড।

পরিবর্তে এটি একটি নির্দিষ্ট ক্লায়েন্ট প্রোগ্রামের একটি কমান্ড যা কোনও এসকিউএল সার্ভারের সাথে সংযোগ স্থাপন করে (সিবেস বা মাইক্রোসফ্ট - ওরাকল কী করবে তা সম্পর্কে নিশ্চিত নয়), ক্লায়েন্ট প্রোগ্রামকে ইঙ্গিত দেয় যে কমান্ডগুলির সেট যা "যেতে" প্রয়োজন না হওয়া পর্যন্ত এটিতে প্রবেশ করেছিল? এক্সিকিউট করার জন্য সার্ভারে প্রেরণ করা হবে।

আপনার / কেন এটি প্রয়োজন?

  • এমএস এসকিউএল সার্ভারে যান একটি "গণনা" প্যারামিটার রয়েছে - সুতরাং আপনি এটিকে "পুনরাবৃত্তি এন টাইম" শর্টকাট হিসাবে ব্যবহার করতে পারেন।

  • অত্যন্ত বড় আপডেটগুলি এসকিউএল সার্ভারের লগটি পূরণ করতে পারে। এটি এড়াতে, তাদের মাধ্যমে ছোট ছোট ব্যাচে বিভক্ত হওয়ার প্রয়োজন হতে পারে go

    আপনার উদাহরণস্বরূপ, যদি দেশীয় কোডগুলির সেটগুলির জন্য আপডেটের এমন ভলিউম থাকে যা এটি লগ স্পেসের বাইরে চলে যায় তবে সমাধানটি হ'ল প্রতিটি দেশের কোডকে একটি পৃথক লেনদেনে আলাদা করা যায় - যা ক্লায়েন্টের সাথে এগুলি পৃথক করে করা যেতে পারে go

  • কিছু এসকিউএল স্টেটমেন্টগুলি কাজ করার জন্য নীচেরগুলির থেকে জিও দ্বারা পৃথক করা উচিত।

    উদাহরণস্বরূপ, আপনি কোনও টেবিলে ফেলে দিতে পারবেন না এবং একই নামকরণের টেবিলটি একটি একক লেনদেনে, কমপক্ষে সিবাসে (পদ্ধতি / ট্রিগার তৈরির জন্য ডিজিট) পুনরায় তৈরি করতে পারবেন না:

> drop table tempdb.guest.x1          
> create table tempdb.guest.x1 (a int)
> go
  Msg 2714, Level 16, State 1
  Server 'SYBDEV', Line 2
  There is already an object named 'x1' in the database.   
  
> drop table tempdb.guest.x1          
> go
> create table tempdb.guest.x1 (a int)
> go
>

4
জিও স্টেটমেন্ট লেনদেন তৈরি করে না। আপনি যদি কোনও বিগিন ট্রান্সএকশন স্টেটমেন্টে একাধিক জিও স্টেটমেন্ট অন্তর্ভুক্ত করেন এবং শেষে আপনি একটি রোলব্যাক করেন তবে এটি সমস্ত জিওর রোলব্যাক করবে। এবং যদি মাঝখানে কোনও জিও হয় তবে আপনি কিছুটা ত্রুটি পেয়ে যাবেন এবং শেষ পর্যন্ত আপনি কমিট করবেন, ত্রুটি ছাড়াই সমস্ত জিও করা হবে। এক ধরণের কৌতুকময়।
টিজেড

7
GO"আপনার জন্য একটি লেনদেন তৈরি করে না"। আপনি যদি সুস্পষ্ট লেনদেন না চালাচ্ছেন তবে প্রতিটি বিবৃতি যেভাবেই এর নিজস্ব লেনদেন তৈরি করে। এটি সম্পূর্ণ orthogonal হয়। আপনি যদি বৃহত্তর আপডেটটিকে ছোট ছোট পদক্ষেপে বিভক্ত করতে চান তবে আপনি এখনও সাধারণ WHILE @@ROWCOUNT > 0প্যাটার্নের মতো একক ব্যাচে এটি করতে পারেন ।
মার্টিন স্মিথ

3
আপনি যদি সুস্পষ্ট লেনদেন না চালাচ্ছেন তবে যাইহোকUPDATE T1 SET X =2;UPDATE T1 SET X =2; দুটি পৃথক লেনদেন হিসাবে চলবে । সংযোজন একেবারে কোনও পার্থক্য করে না। আর একইভাবে যদি আপনি হয় একটি সুনির্দিষ্ট লেনদেন এটা ব্যাচ ঘটনাকাল এবং আবার চলমান কোন পার্থক্য তোলে। GOGO
মার্টিন স্মিথ

4
যেহেতু পরে GOএটি পড়ার জন্য স্পষ্টতা রয়েছে ঠিক তেমন ... লেনদেনের সাথে একেবারেই কিছু করার নেই এবং উত্তরগুলি লেনদেন সম্পর্কে দ্বিতীয় পয়েন্ট এবং লগ ফাইলের আকারকে ভুল করে তোলে। GOযা কিছু হবে তার কোনও প্রভাব নেই। প্রথম এবং তৃতীয় উত্তরগুলি সঠিক। এছাড়াও, এমন সময় আছে যেখানে আপনাকে পৃথক ব্যাচগুলিতে বিবৃতি পৃথক করতে হবে, উদাহরণস্বরূপ আপনি কোনও টেবিলে একটি কলাম যুক্ত করতে পারবেন না এবং পরে একই ব্যাচে পরবর্তী কলামটি ব্যবহার করতে পারবেন না। (অব্যাহত)
রবার্ট ম্যাকি

4
অতিরিক্ত হিসাবে, কিছু ত্রুটিগুলি একটি ব্যাচকে বাতিল করে দেবে (কিছু ত্রুটি কেবলমাত্র একটি বিবৃতি বাতিল করে দেয়), ত্রুটি সনাক্তকরণ এবং পুনরুদ্ধারেও এটি ভূমিকা রাখে। এবং নির্দিষ্ট বিবৃতি ( CREATE VIEWইত্যাদি) তাদের নিজস্ব ব্যাচে থাকা দরকার।
রবার্ট ম্যাকি

26

GO এটি কোনও বিবৃতি নয়, এটি একটি ব্যাচ বিভাজক।

দ্বারা বিচ্ছিন্ন ব্লকগুলি GOক্লায়েন্ট দ্বারা প্রক্রিয়াকরণের জন্য সার্ভারে প্রেরণ করা হয় এবং ক্লায়েন্ট তাদের ফলাফলের জন্য অপেক্ষা করে।

উদাহরণস্বরূপ, আপনি যদি লিখুন

DELETE FROM a
DELETE FROM b
DELETE FROM c

, এটি একটি একক 3লাইন ক্যোয়ারী হিসাবে সার্ভারে প্রেরণ করা হবে ।

যদি লিখি

DELETE FROM a
GO
DELETE FROM b
GO
DELETE FROM c

এটি সার্ভারে 3এক-লাইন অনুসন্ধান হিসাবে প্রেরণ করা হবে ।

GOনিজে সার্ভারে যায় না (কোনও পাং উদ্দেশ্যে নয়)। এটি খাঁটি ক্লায়েন্টের পাশের সংরক্ষিত শব্দ এবং কেবল SSMSএবং এর দ্বারা স্বীকৃত osql

যদি আপনি এটি কোনও সংযোগের মাধ্যমে প্রেরণ করতে একটি কাস্টম ক্যোয়ারী সরঞ্জাম ব্যবহার করেন তবে সার্ভার এমনকি এটি সনাক্ত করতে পারে না এবং ত্রুটি জারি করে না।


4
কেন আপনাকে ব্যাচ করতে হবে না ??
PositiveGuy

3
সুতরাং GO এর অর্থ এটি প্রেরণ করুন এবং তারপরে ক্লায়েন্টটি "ঠিক আছে, সেই ব্যাচটি সম্পন্ন হয়ে গেছে এবং সফল হয়েছিল" অবধি পরবর্তী ব্যাচটি চালাবেন না মূলত জিও যা করে তাই পরবর্তী ব্যাচটি সফলভাবে চালানো যায় এবং ক্লায়েন্ট জানে সার্চ-সাইড সম্পন্ন করার আগে ব্যাচটি নিশ্চিত করুন।
PositiveGuy

3
@ কফিডিক্টিক্ট: মূলত, হ্যাঁ এছাড়াও, কিছু বিবৃতি তাদের ব্যাচে প্রথম হওয়া প্রয়োজন (যেমন CREATE SCHEMA); অন্যান্যদের তাদের ব্যাচে কেবল বিবৃতি হওয়া দরকার (যেমন SET SHOWPLAN_XML ON)
কাসনসুই

19

অনেক কমান্ড তাদের নিজস্ব ব্যাচে থাকতে হবে, মত CREATE PROCEDURE

অথবা, আপনি যদি কোনও টেবিলে একটি কলাম যুক্ত করেন, তবে এটি তার নিজস্ব ব্যাচে থাকা উচিত। যদি আপনি একই ব্যাচে নতুন কলামটি নির্বাচন করার চেষ্টা করেন তবে এটি ব্যর্থ হয় কারণ পার্স / সংকলন সময়ে কলামটি বিদ্যমান নেই।

এটি এসকিউএল সরঞ্জামগুলি একটি স্ক্রিপ্ট থেকে এটিকে কাজ করতে ব্যবহার করে: এটি কোনও এসকিউএল কীওয়ার্ড নয় এবং ইঞ্জিন দ্বারা স্বীকৃত নয়।

এটি ব্যাচগুলির প্রতিদিন ব্যবহারের দুটি শক্ত উদাহরণ।

সম্পাদনা করুন: আপনার উদাহরণে আপনার যেতে হবে না ...

2 সম্পাদনা করুন, উদাহরণস্বরূপ। আপনি এক ব্যাচে ফেলে দিতে পারবেন না, তৈরি করতে পারবেন না ... অন্তত নয়, সঞ্চিত প্রক্রিয়াটি শেষ কোথায়?

IF OBJECT_ID ('dbo.uspDoStuff') IS NOT NULL
    DROP PROCEDURE dbo.uspDoStuff
GO
CREATE PROCEDURE dbo.uspDoStuff
AS
SELECT Something From ATable
GO
GRANT EXECUTE ON dbo.uspDoStuff TO RoleSomeOne
GO

4

কখনও কখনও একই কমান্ড বা বার বার কমান্ড সেট সেট আপ প্রয়োজন হয়। এটি টেস্ট ডেটা inোকানো বা আপডেট করা হতে পারে বা পারফরম্যান্স পরীক্ষার জন্য এটি আপনার সার্ভারে বোঝা চাপানো হতে পারে। এটি করার সহজতম উপায়টি যা প্রয়োজন তা হ'ল কিছু সময় লুপ সেটআপ করা এবং আপনার কোডটি কার্যকর করা, তবে এসকিউএল 2005 এ এটি করার আরও একটি সহজ উপায় রয়েছে।

ধরা যাক আপনি একটি পরীক্ষার টেবিল তৈরি করতে চান এবং এটি 1000 রেকর্ড সহ লোড করতে চান। আপনি নিম্নলিখিত কমান্ডটি জারি করতে পারেন এবং এটি একই কমান্ডটি 1000 বার চালাবে:

CREATE TABLE dbo.TEST (ID INT IDENTITY (1,1), ROWID uniqueidentifier)
GO
INSERT INTO dbo.TEST (ROWID) VALUES (NEWID()) 
GO 1000

উত্স: http://www.mssqltips.com/tip.asp?tip=1216

তা ছাড়া এটি কোনও এসকিউএল ব্লকের "শেষ" চিহ্নিত করে (যেমন একটি সঞ্চিত পদ্ধতিতে) ... এর অর্থ আপনি আবার "পরিষ্কার" অবস্থায় আছেন ... ইজি: কোডটি পুনরায় সেট করার আগে বিবৃতিতে ব্যবহৃত প্যারামিটারগুলি ( আর সংজ্ঞায়িত করা হয়নি)


ঠিক আছে, তাহলে আপনার কেন দরকার? যাতে আপনি জানেন যে সারণি সন্নিবেশ বিবৃতি চালানোর আগে তৈরি হয়েছিল? আমি এখনও এটি পাই না।
PositiveGuy

আমি এটি সম্পর্কে যেভাবে ভাবছি তা দেখুন, আমি যদি আপনার উদাহরণে জিও না পাই, সারণীটি প্রথমে তৈরি হয়েছিল, এখন এটি আছে, সুতরাং সন্নিবেশটি কাজ করা উচিত। আমি টেবিল তৈরি করে থাকলে জিও এর জন্য যা পাই তা আমি পাই না ... এটি পরবর্তী সারণিতে এটি পাওয়া যায় তাই না?!?!?!?!?!
PositiveGuy

2
@ কফিডিক্টিক্ট: না। "ব্যাচ" পার্স করা হয়েছে এবং একবারে সংকলিত হয়েছে। সংকলনের সময়, dbo.TEST এর অস্তিত্ব নেই। আপনি কোনও বস্তু ইনস্ট্যান্ট করছেন না এবং এসকিউএল লাইন
প্রসেসিয়াল

3

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

আসলে, জিও হ'ল এসএসএমএসের দ্বারা ব্যবহৃত ডিফল্ট শব্দ। আপনি চাইলে বিকল্পগুলিতে এটি পরিবর্তন করা যেতে পারে। কিছুটা মজা করার জন্য, "GO" এর পরিবর্তে ব্যাচের পৃথককারী হিসাবে "SELECT" ব্যবহার করার জন্য কারওর সিস্টেমে বিকল্পটি পরিবর্তন করুন। আমার নিষ্ঠুর ছানাটিকে ক্ষমা করুন।


1
এখানে আসলে একটি গুরুতর বিষয় রয়েছে: আপনার জিওর সাথে এমন আচরণ করা উচিত যেন এটি কোনও কীওয়ার্ড না থাকলেও। আপনার এটি কখনও পরিবর্তন করা উচিত নয়। বিশেষ শনাক্তকারীদের পুনরায় ব্যবহারের কারণে বাগগুলি ডিবাগ করা খুব কঠিন হতে পারে।
জর্জেন ফোগ

@ ডিক্সি ফ্ল্যাটলাইন: আপনি কি ঘোষিত ভেরিয়েবলগুলি অদৃশ্য না হওয়ার বিষয়ে নিশ্চিত? এমএসএসকিউএল ২০১ In-তে আমি চলার সময় একটি "ভেরিয়েবল ইতিমধ্যে ঘোষিত" ত্রুটি পেয়েছি: ঘোষণা $ পরীক্ষা ইন; সেট $ পরীক্ষা = 5; পরীক্ষা পরীক্ষা; ঘোষণা $ পরীক্ষা ইন; - at প্রতি <at> দিয়ে প্রতিস্থাপন করুন, এসই মন্তব্যে একাধিক <at> ব্যবহার করতে পারবেন না।
ওয়াউটার

0

এটি লজিকাল ব্লকগুলি বিভক্ত করতে ব্যবহৃত হয়। আপনার কোডটি এসকিএল কমান্ড লাইনে ব্যাখ্যা করা হবে এবং এটি কোডের পরবর্তী ব্লককে নির্দেশ করে।

তবে এটি নির্দিষ্ট সংখ্যার সাথে পুনরাবৃত্ত বিবৃতি হিসাবে ব্যবহার করা যেতে পারে।

চেষ্টা করুন:

exec sp_who2  
go 2

কিছু বিবৃতি জিও দ্বারা সীমিত করা উচিত:

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