প্রতি টি-এসকিউএল স্টেটমেন্টের পরে যান


34

প্রতিটি এসকিউএল স্টেটমেন্টের পরে জিও স্টেটমেন্ট ব্যবহার করার পিছনে যুক্তি কী? আমি বুঝতে পারি যে জিও ব্যাচের শেষের সিগন্যাল দেয় এবং / অথবা বিবৃতিগুলির সুনামের অনুমতি দেয় তবে প্রতিটি বিবৃতি দেওয়ার পরে এটি কী সুবিধা অর্জন করে।

আমি খুব কৌতূহলী হিসাবে মাইক্রোসফ্ট ডকুমেন্টেশন ইত্যাদি প্রতিটি প্রতিবেদনের পরে এটি ব্যবহার শুরু করেছে বা সম্ভবত আমি সন্ধান করতে শুরু করেছি।

এছাড়াও সেরা অনুশীলন হিসাবে বিবেচনা করা হয়?

উত্তর:


51

কখন এটি ব্যবহার করতে হবে এবং কেন, তার উত্তর দেওয়ার আগে এটি ঠিক কী GOএবং কোনটি নয় তা বোঝার ক্ষেত্রে এটি সর্বপ্রথম ।

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

এখানে চিত্র বর্ণনা লিখুন

উপরের স্ক্রিনশটটি এসএসএমএসের মধ্যে একটি বিকল্প যা কনফিগারযোগ্য।

তবে ব্যাচ কি ?? এই বিওএল রেফারেন্সটি এটিকে সেরা বলেছে:

ব্যাচ হ'ল এক বা একাধিক লেনদেন-এসকিউএল স্টেটমেন্টের একটি গ্রুপ যা একই সময়ে এসকিউএল সার্ভারে প্রয়োগের জন্য প্রেরণের জন্য প্রেরণ করা হয়েছিল।

যে হিসাবে সহজ। এটি কেবল একটি কাস্টম পদ্ধতিতে একটি অ্যাপ্লিকেশন (হ্যাঁ ... একটি অ্যাপ্লিকেশন) এসকিউএল সার্ভারে বিবৃতি প্রেরণ করে। এর একটি প্রয়োগ-বর্ণনামূলক উদাহরণটি দেখুন। এসকিউএল সার্ভারে বিবৃতি এবং ব্যাচগুলি প্রেরণে কোনও অ্যাপ্লিকেশন কী করবে তা নকল করতে আমি পাওয়ারশেল ব্যবহার করব:

$ConnectionString = "data source = SomeSQLInstance; initial catalog = AdventureWorks2012; trusted_connection = true; application name = BatchTesting;"

try {
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection($ConnectionString)
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.Connection = $SqlConnection

    # first batch of statements
    #
    $SqlCmd.CommandText = "
        select * from humanresources.department where departmentid = 1;
        select * from humanresources.department where departmentid = 2;
        select * from humanresources.department where departmentid = 3;
        select * from humanresources.department where departmentid = 4;"

    # execute the first batch
    #
    $SqlConnection.Open()
    $SqlCmd.ExecuteNonQuery()
    $SqlConnection.Close()

    # second batch of statements
    #
    $SqlCmd.CommandText = "
        select * from humanresources.department where departmentid = 5;
        select * from humanresources.department where departmentid = 6;
        select * from humanresources.department where departmentid = 7;
        select * from humanresources.department where departmentid = 8;"

    # execute the second batch
    #
    $SqlConnection.Open()
    $SqlCmd.ExecuteNonQuery()
    $SqlConnection.Close()
}
catch {
    $SqlCmd.Dispose()
    $SqlConnection.Dispose()
    Write-Error $_.Exception
}

মন্তব্যগুলি এটিকে ছেড়ে দেয়, তবে আপনি উপরে দেখতে পারেন যে আমরা প্রোগ্রাম্যালি এসকিউএল সার্ভারে দুটি ব্যাচ প্রেরণ করছি । যদিও তা যাচাই করা যাক। আমার পছন্দটি হ'ল বর্ধিত ইভেন্টগুলি ব্যবহার করা:

create event session BatchTesting
on server
add event sqlserver.sql_batch_starting
(
    set
        collect_batch_text = 1
    where
    (
        sqlserver.client_app_name = N'BatchTesting'
    )
),
add event sqlserver.sql_batch_completed
(
    set
        collect_batch_text = 1
    where
    (
        sqlserver.client_app_name = N'BatchTesting'
    )
),
add event sqlserver.sql_statement_starting
(
    set
        collect_statement = 1
    where
    (
        sqlserver.client_app_name = N'BatchTesting'
    )
),
add event sqlserver.sql_statement_completed
(
    set
        collect_statement = 1
    where
    (
        sqlserver.client_app_name = N'BatchTesting'
    )
)
add target package0.event_file
(
    set
        filename = N'<MyXelLocation>\BatchTesting.xel'
);
go

alter event session BatchTesting
on server
state = start;
go

এই সমস্ত এক্সেভেন্টস অধিবেশনটি করছে যে নামকরণ করা অ্যাপ্লিকেশন থেকে শুরু এবং সম্পূর্ণ হওয়া স্টেটমেন্টগুলি এবং ব্যাচগুলি ক্যাপচার করছে "BatchTesting"(যদি আপনি আমার পাওয়ারশেল কোড উদাহরণে আমার সংযোগের স্ট্রিংটি লক্ষ্য করেন তবে এটি "অ্যাপ্লিকেশনটি ব্যবহার করে ইভেন্টের নির্দিষ্ট সূচককে দেখার দ্রুত উপায়) নাম "সংযোগ স্ট্রিং প্যারামিটার এবং এটি থেকে ফিল্টারিং)।

আমি এই ব্যাচগুলি এবং বিবৃতিগুলি পাঠানোর জন্য পাওয়ারশেল কোডটি কার্যকর করার পরে, আমি নিম্নলিখিত ফলাফলগুলি দেখতে পাচ্ছি:

এখানে চিত্র বর্ণনা লিখুন

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

    select * from humanresources.department where departmentid = 1;
    select * from humanresources.department where departmentid = 2;
    select * from humanresources.department where departmentid = 3;
    select * from humanresources.department where departmentid = 4;

ব্যাচ কী তা সেই ব্যাখ্যার সাথে সাথে , এখন কখন ব্যাচগুলি শেষ করতে হবে সে সম্পর্কে আপনার প্রশ্নের উত্তর আসে । ব্যাচ সম্পর্কিত বিওএল রেফারেন্সে ব্যাচগুলির নিয়মগুলি পাওয়া যায় :

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

একটি টেবিল পরিবর্তন করা যাবে না এবং তারপরে নতুন কলামগুলি একই ব্যাচে রেফারেন্স করা হবে।

যদি কোনও এক্সিকিউটি স্টেটমেন্টটি কোনও ব্যাচের প্রথম বিবৃতি হয় তবে EXECUTE কীওয়ার্ডের প্রয়োজন হবে না। যদি এক্সেকিউটি স্টেটমেন্টটি ব্যাচের প্রথম বিবৃতি না হয় তবে এক্সেকিউট কীওয়ার্ডটি প্রয়োজনীয়।

তেমনিভাবে, কিছু রানটাইম ত্রুটি (সংকলন ত্রুটিগুলি একটি ব্যাচের কার্য সম্পাদন শুরু করতে দেয় না) যা ব্যাচের সময় ঘটে তা বিভিন্ন আচরণের কারণ হতে পারে: ব্যাচটি পুরোপুরি বাতিল করা, বা ব্যাচটি চালিয়ে যাওয়া এবং কেবল আপত্তিকর স্টেটমেন্টটি বাতিল করা (উপরের অংশে) লিঙ্ক দুটি সত্যই ভাল উদাহরণ দেয়: উদাহরণস্বরূপ, একটি গাণিতিক ওভারফ্লো ত্রুটি ব্যাচের কার্যকারিতা বন্ধ করবে, যেখানে সীমাবদ্ধতা লঙ্ঘন ত্রুটি কেবলমাত্র বর্তমান বিবৃতিটি সম্পূর্ণ হতে বাধা দেবে তবে ব্যাচটি কার্যকর করা চালিয়ে যাবে)।

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


সম্ভবত একটি নির্লজ্জ মন্তব্য কিন্তু এটি আমাকে আঘাত করেছে যে এসকিউএল সার্ভার নিজেই ব্যাচগুলিতে কী চালাতে হবে তা নির্ধারণ করতে পারে (একইভাবে অন্যান্য অনেক অপটিমাইজেশন যেমন ডাটাবেস ইঞ্জিন দ্বারা পরিচালিত হয়)। উদাহরণস্বরূপ, স্ক্রিপ্ট ব্যবহারকারীর উপর নির্ভর করার পরিবর্তে আপনি বর্ণিত বিধিগুলি ব্যবহার করে যা ত্রুটিযুক্ত হতে পারে এবং স্ক্রিপ্টগুলিতে অপ্রয়োজনীয় ব্লাট যুক্ত করে বলে মনে হয়।
স্টিভ চেম্বারস

1
@ স্টিভচ্যাম্বার্স আমার অনুভূতিটি হুবহু উত্তরটি বলছে "এটি এতটা সহজ" (ব্যাচ হ'ল এক বা একাধিক লেনদেন-এসকিউএল স্টেটমেন্টের একটি গ্রুপ যা একই সাথে এসকিউএল সার্ভারে প্রয়োগের জন্য প্রেরণের জন্য পাঠানো হয়েছিল।) তবে এটি তা নয়। এখানে বিবৃতিগুলির সংমিশ্রণ রয়েছে যা আমি চেষ্টা করতে এবং ব্যর্থ করে একটি ব্যাচে প্রেরণ করতে পারি। পরিশেষে আমি তোমাদের বুঝতে হবে মনে কেন এবং কিভাবে : তাই পরিশেষে আমি এই এক আমার নিজের উত্তর অবদান - একটি ব্যাচ পাঠানোর পৃথক বিবৃতির একটি সেট পাঠানোর চেয়ে ভিন্ন stackoverflow.com/a/56370223/3714936 - যা আপনার মন্তব্যের কথা বলে ।
youcantryreachingme
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.