এসকিউএল স্টেটমেন্টগুলির পক্ষে কি এসকিউএল সার্ভারে একক অধিবেশন একই সাথে সম্পাদন করা সম্ভব?


16

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

উত্তর:


19

যদিও সকল ব্যবহারিক উদ্দেশ্যে ব্রেন্টের উত্তরটি সঠিক, এবং এটি এমনটি নয় যা আমি কখনও কাউকে উদ্বিগ্ন হতে দেখেছি, একটি সেশনে সঞ্চিত পদ্ধতিতে একাধিক অনুরোধের জন্য একটি সেশন-স্কোপড # টেম্প টেবিলের মাধ্যমে একে অপরকে প্রভাবিত করা সম্ভব ।

ভাল খবর এটা হয় অত্যন্ত বন্য কারণ ঘটতে অসম্ভাব্য

1) # একটি সঞ্চিত পদ্ধতি বা নেস্টেড ব্যাচগুলির অভ্যন্তরে ঘোষিত টেম্প টেবিলগুলিতে সেশনের দৃশ্যমানতা (বা আজীবন) নেই। এবং এগুলি এখন পর্যন্ত সবচেয়ে সাধারণ ক্ষেত্রে।

২) এর জন্য মাল্টিপল অ্যাক্টিভরসালসেটসেট এবং কিছু খুব অদ্ভুত অ্যাসিঙ্ক ক্লায়েন্ট প্রোগ্রামিং বা মাঝখানে একটি রিসেট সেট ফিরিয়ে আনার জন্য সঞ্চিত পদ্ধতি এবং ক্লায়েন্টকে প্রথম থেকে ফলাফল প্রক্রিয়াকরণের সময় সঞ্চিত পদ্ধতির অন্য উদাহরণটি কল করতে হবে।

এখানে একটি স্বীকৃত উদাহরণ:

using System;
using System.Data.SqlClient;

namespace ado.nettest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var con = new SqlConnection("Server=localhost;database=tempdb;integrated security=true;MultipleActiveResultSets = True"))
            {
                con.Open();

                var procDdl = @"
create table #t(id int)
exec ('
create procedure #foo
as
begin
  insert into #t(id) values (1);
  select top 10000 * from sys.messages m, sys.messages m2;
  select count(*) rc from #t;
  delete from #t;
end
');
";
                var cmdDDL = con.CreateCommand();
                cmdDDL.CommandText = procDdl;
                cmdDDL.ExecuteNonQuery();

                var cmd = con.CreateCommand();
                cmd.CommandText = "exec #foo";
                using (var rdr = cmd.ExecuteReader())
                {
                    rdr.Read();

                    var cmd2 = con.CreateCommand();
                    cmd2.CommandText = "exec #foo";
                    using (var rdr2 = cmd2.ExecuteReader())
                    {

                    }

                    while (rdr.Read())
                    {

                    }
                    rdr.NextResult();
                    rdr.Read();
                    var rc = rdr.GetInt32(0);
                    Console.WriteLine($"Numer of rows in temp table {rc}");

                }


            }

            Console.WriteLine("Hit any key to exit");
            Console.ReadKey();
        }
    }
}

যা ফলাফল

Numer of rows in temp table 0
Hit any key to exit

কারণ সঞ্চিত পদ্ধতির দ্বিতীয় অনুরোধটি একটি সারি inোকিয়েছে এবং তারপরে প্রথম অনুরোধ ক্লায়েন্টটির প্রথম ফলসেট থেকে সারি আনার জন্য অপেক্ষা করছিল এমন সময় থেকে সমস্ত সারি # টি থেকে মুছে ফেলে। মনে রাখবেন যে প্রথম ফলাফলটি যদি ছোট হয় তবে সারিগুলি বার্ফার হতে পারে এবং ক্লায়েন্টকে কিছু না পাঠিয়ে কার্যকর করা চালিয়ে যেতে পারে।

যদি আপনি সরান

create table #t(id int)

সঞ্চিত পদ্ধতিতে এটি আউটপুট করে:

Numer of rows in temp table 1
Hit any key to exit

এবং পদ্ধতির ভিতরে ঘোষণা করা টেম্প টেবিলের সাহায্যে আপনি যদি দ্বিতীয় কোয়েরিতে পরিবর্তন করেন

cmd2.CommandText = "select * from #t";

এটি এতে ব্যর্থ হয়:

'অবৈধ অবজেক্টের নাম' # টি ''

কারণ কোনও স্টোরেজ পদ্ধতি বা নেস্টেড ব্যাচের ভিতরে তৈরি # টেম্প টেবিলটি কেবলমাত্র সেই সঞ্চিত প্রক্রিয়া বা ব্যাচে এবং নেস্টেড পদ্ধতি এবং ব্যাচগুলিতে কল হয় যা প্রদর্শিত হয় এবং প্রক্রিয়া বা ব্যাচ শেষ হয়ে গেলে তা ধ্বংস হয়ে যায়।


12

একসাথে নয়। আপনার বিকল্পগুলির মধ্যে রয়েছে:

  • একই সেশনে একের পর এক অনুসন্ধানগুলি চালাও
  • কোনও টেম্প টেবিল থেকে একটি গ্লোবাল টেম্প টেবিলটিতে স্যুইচ করুন (# টেবিলনামের পরিবর্তে ## টেবিল নাম ব্যবহার করুন) তবে সচেতন থাকুন যে টেম্প টেবিল তৈরি করা সেশনটি বন্ধ হয়ে গেলে গ্লোবাল টেম্প টেবিলটি স্বয়ংক্রিয়ভাবে বাদ পড়ে যায় এবং এর সাথে অন্য কোনও সক্রিয় সেশন নেই are এটি একটি রেফারেন্স
  • টেম্পডিবি-তে একটি সত্যিকারের ব্যবহারকারীর টেবিলটিতে স্যুইচ করুন - আপনি সেখানে টেবিল তৈরি করতে পারেন, তবে সচেতন হন যে তারা সার্ভার পুনরায় চালু করতে গিয়ে অদৃশ্য হয়ে যাবে
  • একটি ব্যবহারকারী ডাটাবেসে একটি বাস্তব ব্যবহারকারী সারণীতে স্যুইচ করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.