বিভিন্ন সার্ভারে দুটি পৃথক ডাটাবেসে দুটি টেবিল রয়েছে, কয়েকটি প্রশ্ন তৈরি করতে আমার এগুলিতে যোগ দেওয়া দরকার। আমার কাছে কী বিকল্প আছে? আমার কি করা উচিৎ?
উত্তর:
আপনাকে sp_addlinkedserver
একটি সার্ভার লিঙ্ক তৈরি করতে ব্যবহার করতে হবে। ব্যবহারের জন্য রেফারেন্স ডকুমেন্টেশন দেখুন । একবার সার্ভার লিঙ্কটি প্রতিষ্ঠিত হয়ে গেলে, আপনি অন্যান্য সার্ভারের সাথে ডাটাবেসের নাম উপসর্গ করে, সাধারণ হিসাবে ক্যোয়ারীটি তৈরি করবেন। আইই:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
লিঙ্কটি একবার প্রতিষ্ঠিত হয়ে গেলে, আপনি OPENQUERY
রিমোট সার্ভারে একটি এসকিউএল বিবৃতি কার্যকর করতে এবং কেবলমাত্র ডেটা আপনার কাছে ফিরিয়ে আনতে ব্যবহার করতে পারেন। এটি কিছুটা দ্রুত হতে পারে এবং এটি দূরবর্তী সার্ভারকে আপনার ক্যোয়ারীটি অনুকূল করতে দেয়। যদি আপনি DB1
উপরের উদাহরণে অস্থায়ী (বা মেমরির) সারণীতে ডেটা ক্যাশে করেন তবে আপনি কোনও মানক টেবিলে যোগদানের মতো এটিতে ক্যোয়ারী করতে সক্ষম হবেন। উদাহরণ স্বরূপ:
-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')
-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID
পরীক্ষা করে দেখুন ডকুমেন্টেশন OPENQUERY জন্য আরো কিছু উদাহরণ দিতে দেখতে। উপরের উদাহরণটি বেশ স্বীকৃত। আমি অবশ্যই এই নির্দিষ্ট উদাহরণে প্রথম পদ্ধতিটি ব্যবহার করব, তবে দ্বিতীয় বিকল্পটি ব্যবহার করে OPENQUERY
আপনি কিছু ডেটা ফিল্টার করার জন্য কোয়েরিটি ব্যবহার করলে কিছু সময় এবং কার্যকারিতা বাঁচাতে পারে।
এটা চেষ্টা কর:
SELECT tab2.column_name
FROM [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2] tab2
ON tab1.col_name = tab2.col_name
যদি কোনও লিংকযুক্ত সার্ভারটি আপনার ডিবিএ দ্বারা অনুমোদিত না হয় তবে আপনি OPENROWSET ব্যবহার করতে পারেন। বই অনলাইন আপনার প্রয়োজনীয় বাক্য সরবরাহ করবে।
দুটি সারণীর সংযুক্তি একটি ডিবিএমএস দ্বারা সেরা করা হয়, সুতরাং এটি সেভাবে করা উচিত। আপনি কোনও ডাটাবেসে ছোট টেবিল বা এটির উপসেটটি আয়না করতে পারেন এবং তারপরে সেগুলিতে যোগদান করতে পারেন। কেউ ইনফরমিটিকার মতো ইটিএল সার্ভারে এটি করার প্রলোভন পেতে পারে তবে আমার ধারণা অনুমান করা যায় যে টেবিলগুলি বিশাল পরিমাণে হয় তবে এটি ঠিক নয়।
হার্ড-কোডেড ডাটাবেসের নামগুলি একটি এসকিউএল-কোয়েরির মধ্যে সর্বদা সেরা পদ্ধতির নয়। সুতরাং প্রতিশব্দ যুক্ত করা একটি ভাল পদ্ধতির হবে। এটি প্রায়শই নয় যে বেশ কয়েকটি মঞ্চে পরিবেশে ডেটাবেসগুলির একই নাম থাকে। তারা PROD, UAT, SIT, QA এবং এর মতো পোস্টফিক্স দ্বারা গঠিত হতে পারে। সুতরাং হার্ড-কোডেড প্রশ্নের সম্পর্কে সচেতন হন এবং তাদের আরও গতিশীল করুন।
পদ্ধতির # 1: একই সার্ভারে ডাটাবেসের মধ্যে টেবিলগুলি লিঙ্ক করতে প্রতিশব্দ ব্যবহার করুন।
পদ্ধতির # 2: প্রতিটি ডাটাবেস থেকে আলাদা করে ডেটা সংগ্রহ করুন এবং এটি আপনার কোডে যোগ দিন। আপনার ডাটাবেস সংযোগের স্ট্রিংগুলি কোনও ডাটাবেস বা কোনও কনফিগার ফাইলের মাধ্যমে আপনার অ্যাপ-সার্ভার কনফিগারেশনের অংশ হতে পারে।
আমি নীচে এই কোডটি চেষ্টা করেছিলাম এবং এটি ঠিকঠাক কাজ করছে
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
আপনি নিম্নলিখিত চেষ্টা করতে পারেন:
select customer1.Id,customer1.Name,customer1.city,CustAdd.phone,CustAdd.Country
from customer1
inner join [EBST08].[Test].[dbo].[customerAddress] CustAdd
on customer1.Id=CustAdd.CustId
এই জন্য সহজভাবে নীচের কোয়েরি অনুসরণ করুন
select a.Id,a.type,b.Name,b.City from DatabaseName.dbo.TableName a left join DatabaseName.dbo.TableName b on a.Id=b.Id
আমি যেখানে ডাটাবেসনাম লিখেছি সেখানে আপনাকে ডাটাবেসের নাম নির্ধারণ করতে হবে। আপনি যদি একই ডাটাবেসে থাকেন তবে আপনাকে ডাটাবেসের নাম সংজ্ঞায়িত করার দরকার নেই তবে আপনি যদি অন্য ডাটাবেসে থাকেন তবে আপনাকে ডাটাবেসের নামটিকে পথ হিসাবে উল্লেখ করতে হবে বা এটি আপনাকে ত্রুটি দেখাবে। আশা করি আপনার কাজটি সহজ করে দিয়েছি
এই দুটি টেবিলটিতে যোগ দিতে যখন আমার সমস্যা হচ্ছে, তখন একই সাথে দুটি দূরবর্তী ডেটাবেস খোলার মাধ্যমে আমি যা করতে চেয়েছিলাম ঠিক তা করতেই আমি পালিয়ে গেলাম। মাইএসকিউএল 5.6 (পিএইচপি 7.1) এবং অন্যান্য মাইএসকিউএল 5.1 (পিএইচপি 5.6)
//Open a new connection to the MySQL server
$mysqli1 = new mysqli('server1','user1','password1','database1');
$mysqli2 = new mysqli('server2','user2','password2','database2');
//Output any connection error
if ($mysqli1->connect_error) {
die('Error : ('. $mysqli1->connect_errno .') '. $mysqli1->connect_error);
} else {
echo "DB1 open OK<br>";
}
if ($mysqli2->connect_error) {
die('Error : ('. $mysqli2->connect_errno .') '. $mysqli2->connect_error);
} else {
echo "DB2 open OK<br><br>";
}
আপনি যদি স্ক্রিনে এই দুটি ঠিক আছে, তবে উভয় ডাটাবেস খোলা এবং প্রস্তুত। তারপরে আপনি আপনার অনুসন্ধানগুলি করতে এগিয়ে যেতে পারেন।
$results = $mysqli1->query("SELECT * FROM video where video_id_old is NULL");
while($row = $results->fetch_array()) {
$theID = $row[0];
echo "Original ID : ".$theID." <br>";
$doInsert = $mysqli2->query("INSERT INTO video (...) VALUES (...)");
$doGetVideoID = $mysqli2->query("SELECT video_id, time_stamp from video where user_id = '".$row[13]."' and time_stamp = ".$row[28]." ");
while($row = $doGetVideoID->fetch_assoc()) {
echo "New video_id : ".$row["video_id"]." user_id : ".$row["user_id"]." time_stamp : ".$row["time_stamp"]."<br>";
$sql = "UPDATE video SET video_id_old = video_id, video_id = ".$row["video_id"]." where user_id = '".$row["user_id"]."' and video_id = ".$theID.";";
$sql .= "UPDATE video_audio SET video_id = ".$row["video_id"]." where video_id = ".$theID.";";
// Execute multi query if you want
if (mysqli_multi_query($mysqli1, $sql)) {
// Query successful do whatever...
}
}
}
// close connection
$mysqli1->close();
$mysqli2->close();
আমি কিছু যোগদান করার চেষ্টা করা হয়েছিল কিন্তু যেহেতু আমি ঐ দুই DBS খুলতে গেলাম, তারপর আমি ফিরে যেতে পারেন এদিক ওদিক মাত্র সংযোগ পরিবর্তন করে querys করছেন $mysqli1
বা$mysqli2
এটি আমার পক্ষে কাজ করেছে, আমি আশা করি এটি সাহায্য করবে ... চিয়ার্স