যদিও সকল ব্যবহারিক উদ্দেশ্যে ব্রেন্টের উত্তরটি সঠিক, এবং এটি এমনটি নয় যা আমি কখনও কাউকে উদ্বিগ্ন হতে দেখেছি, একটি সেশনে সঞ্চিত পদ্ধতিতে একাধিক অনুরোধের জন্য একটি সেশন-স্কোপড # টেম্প টেবিলের মাধ্যমে একে অপরকে প্রভাবিত করা সম্ভব ।
ভাল খবর এটা হয় অত্যন্ত বন্য কারণ ঘটতে অসম্ভাব্য
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";
এটি এতে ব্যর্থ হয়:
'অবৈধ অবজেক্টের নাম' # টি ''
কারণ কোনও স্টোরেজ পদ্ধতি বা নেস্টেড ব্যাচের ভিতরে তৈরি # টেম্প টেবিলটি কেবলমাত্র সেই সঞ্চিত প্রক্রিয়া বা ব্যাচে এবং নেস্টেড পদ্ধতি এবং ব্যাচগুলিতে কল হয় যা প্রদর্শিত হয় এবং প্রক্রিয়া বা ব্যাচ শেষ হয়ে গেলে তা ধ্বংস হয়ে যায়।