PDA

View Full Version : اتصال دو بانک اطلاعاتی



hamed_F
جمعه 01 دی 1385, 11:06 صبح
سلام دوستان
چگونه می توان دو جدول از دوبانک مختلف برروی یک سرور را باهم JOIN کرد؟؟

AminSobati
جمعه 01 دی 1385, 11:32 صبح
سلام،
جداول رو به صورت سه قسمتی نام ببرید:
SELECT * FROM DB1.dbo.Customers JOIN DB2.dbo.Orders

mostafa_leman
جمعه 01 دی 1385, 15:50 عصر
اگه نام یکی از دیتابیس ها متغیر باشه اونوقت نمیشه اونو به عنوان پارامتر ارسال کرد؟
مثلا به ازای هر سال مالی یک دیتابیس میسازیم . حالا چطوری باید نام دیتابیس رو به عنوان پارامتر ارسال کرد؟؟

AminSobati
جمعه 01 دی 1385, 16:17 عصر
نه عزیزم،
تنها در حالتی میشه اون رو پارامتر کرد که از Dynamic TSQL استفاده کنین.

mostafa_leman
جمعه 01 دی 1385, 16:38 عصر
نه عزیزم،
تنها در حالتی میشه اون رو پارامتر کرد که از Dynamic TSQL استفاده کنین.

میشه بیشتر توضیح بدین؟

AminSobati
جمعه 01 دی 1385, 23:18 عصر
Dynamic TSQL رو در این بخش Search کنین

mostafa_leman
شنبه 02 دی 1385, 10:57 صبح
سلام . ممنون از راهنماییتون . من به این نتیجه رسیدم که استفاده از Dynamic TSQL زیاد معقولانه نیست . شما تو این پست گفته بودید که Sp رو یک بار با Dynamic TSQL بسازیم .


احسان جان امیدوارم مشکل رو خوب درک کرده باشم:
پیشنهاد من اینه که بوسیله Dynamic TSQL برای هر دیتابیس، SP ایجاد کنین و کاربرها از طریق این SP به اطلاعاتشون دسترسی پیدا کنند. حسن این کار اینه که Dynamic TSQL فقط یکبار در موقع ساخت SP انجام میشه و در دفعات بعدی کاربرها واقعا SP مربوط به خودشون رو Call میکنند. مثلا:


use northwind
go
declare @tbl_name varchar(100)
declare @DynTSQL varchar(1000)
set @tbl_name='customers'
set @DynTSQL='create proc mysp1 as select * from ' + @tbl_name
exec (@DynTSQL)
go

حالا هر کاربر میتونه در دیتابیس خودش exec mysp1 رو Call کنه و جدول مورد نظر براش Query بشه.

اما من یک مشکل دارم . اونم اینکه این SP ها رو توی دیتابیس اصلی برنامه دارم و به ازای هر دیتابیس فقط نام دیتابیس تغییر می کنه . حالا یک سوال ؟ امکان داره اطلاعات Sp رو با یک Sp دیگه ویرایش کنم ؟ اگه نیست یک راه پیش من بگذارید لطفا

AminSobati
شنبه 02 دی 1385, 14:58 عصر
هر دیتابیس باید SPهای متعلق به خودش رو داشته باشه. منظور شما اینه که SPها در یک مثلا دیتابیس مرکزی باشه؟
در ضمن، داخل SP نمیشه ALTER PROC استفاده کرد، مگر اینکه این دستور هم بصورت Dynamic تولید و اجرا بشه. ولی کلا هنوز اصل سوال شما برای من روشن نیست!

mostafa_leman
شنبه 02 دی 1385, 15:47 عصر
ببینید من یک برنامه (تقریبا شبیه نرم افزار حسابداری ) نوشتم که ابتدا اومدم همه ی اطلاعات رو توی یک دیتابیس ساختم و جهت متمایز کردن داده ها از فیلد سال مالی استفاده کردم . بعد هر بار که Select میکردم فقط اطلاعات اون سال مالی رو انتخاب میکردم . اما این روش سرعت برنامه رو به صورت چشمگیر می آورد پایین . چون مثلا بعد 5..4 سال امکان داشت حدود 100,000 سند زده باشه و این سرعت فراخوانی دیتابیس رو پایین می آورد . علاوه بر این به ازای هر صورتحساب تعدادی کالای سفارش داده شده ثبت میشد که سرعت فراخوانی فاکتورها و . . . رو پایین می آورد .
حالا اومدم یک سری جداول اصلی ( مانند لیست مشترکین و فروشندگان و کالاها و ... که همیشه واحد هستند ) رو توی یک دیتابیس مرکزی نگهداری میکنم و به ازای هر سال مالی یک دیتابیس مثلا DBO1386 میسازم که شامل ( اسناد و فاکتورها و . . . . که متغیر هستند ) میشود
اینطوری آخر هر سال مالی دیتابیس جدید ساخته میشود و سرعت هیچ فرقی نمیکند . یک قسمت از SP ها رو که باید از دو بانک استفاده کنه و توی برنامه بکار گرفته بشه بوسیله برنامه مقدار دهی میکنم و مشکلی پیش نمیاد ( یعنی SP رو توی سورس برنامه مینویسم و همونجا مقدارش رو تنظیم میکنم ) اما بعضی SP ها هستند که کریستال ریپورت میخواهد ازشون استفاده کنه و از طرفی ConnectionString اون قابل تغییر نیست (چون نرم افزار من فعلا تحت شبکه نیست ) و مجبورم توی دیتابیس مرکزی بنویسم ) . به همین خاطر میخوام بتونم این SP رو ویرایش کنم یا اینکه نام دیتابیس رو به صورت پارامتر ارسال کنم

AminSobati
شنبه 02 دی 1385, 21:11 عصر
سناریویی که شما توضیح دادین کمی جای بحث داره. مساله مهم اینجاست که صد هزار رکورد (حتی با وجود جزئیات و صورتحسابها) یعنی مقدار بسیار ناچیز (از نظر حجم اطلاعات) و اگر با این رقم رکورد، برنامه کند میشه مشخصه که Queryهای برنامه ایندکسهای مناسبی در اختیارشون نیست و مرتبا Table Scan، و هنگام Joinها قطعا Hash Join داره اتفاق میافته. این مسئله زمانی که برنامه تحت شبکه بشه و چند کاربر همزمان کار انجام بدن پررنگ تر و محسوس تر میشه (البته اگر سال مالی بخصوصی مد نظر باشه و فیلترهایی روی Query اعمال کنید. چون در صورت خواستن همه رکوردها، کند بودن بدیهیه). اگر فرد متخصصی در اختیارتون نیست، حداقل از ابزارهایی مثل Index Tuning Wizard استفاده کنین تا قدری وضعیت بهبود پیدا کنه.
اما از طرفی منکر راه حل شما نیستم چرا که به هر حال آرشیو کردن اطلاعات یکی از روشهای استاندارد هستش (البته برای حجمهای بسیار بالا). نکته مهم در آرشیو کردن اینه که در حالت ایده آل، دیتابیس باید از ابتدا با دیدگاه آرشیو کردن طراحی بشه. بعدا اگر این کار بخواد انجام بشه، معمولا درد سرهایی وجود داره.
اگر براتون امکان داره، از View استفاده کنین. مثلا برای هر گزارش،یک SP داشته باشید اما این SP از یک View استفاده کنه که اطلاعات مورد نیاز رو فراهم میکنه (سال مالی بخصوص). شاید به این وسیله به جای اعمال تغییر روی SP، بشه View رو تغییر داد. اما خود تغییر View بصورت اتوماتیک و از داخل برنامه، مستلزم ALTER VIEW از طریق Dynamic TSQL هست

rasoolgh
یک شنبه 03 دی 1385, 08:18 صبح
SELECT A.FIELD1 ,B.FIELD2 FROM DB1..T1 A INNER JOIN DB2..T2 B ON A.FIELD3=B.FIELD3