ورود

View Full Version : سوال: انتقال اطلاعات از دو بانک متفاوت توسط دستورات SQL نه حلقه



0armin0
شنبه 21 اسفند 1389, 19:40 عصر
سلام. من میخوام از دیتابیس x که sql server هست و جدول a که در اون قرار داره اطلاعات رو در دیتابیس y که access هست در جدول b اون insert کنم . غیر از حلقه و یکی یکی اضافه کردن اونا راهی هست که با دستور های sql داده ها رو یکراست در جدول مقصد b منتقل کنم و سرعت بالا باشه؟
در ضمن بگم حتم باید از طریق برنامه باشه چون برنامه اول و دوم مجزا هستن و مدام اطلاعات در برنامه اول وارد میشه و بعد از مدتی کاربر باید خودش این داده ها رو انتقال بده.
فقط بگین دستور sql رو چطور بنویسم چون جدولها در دو بانک متفاوته و ADO Connection های متفاوت نمیدونم sql رو چطور بنویسم؟ :قلب:

vahid_1360
یک شنبه 22 اسفند 1389, 11:46 صبح
سلام
آخه ورژن sql server -ت مهمه. ولی دستور bulk insert تو همه اجرا میشه ولی دستورش یه کم حرفه ای است.
در غیر این باید از addlinkedserver ها استفاده کنی که فکر میکنم مایکروسافت اینو فقط گذاشته که باشه.
یاعلی

0armin0
یک شنبه 22 اسفند 1389, 14:51 عصر
ورژنش 2008 R2 و Microsoft Sql Server Management Stadio ورژن 10.50.1600.1
البته نسخش اگه هرچی باشه تهم نیست تهیه می کنم. اون دستور هایی که باید استفاده بشه چطوریه؟ مثلا اینطور بگین
INSERT INTO b (b1 , b2 , b3) (Select (a1,a2,a3) from a)
البته این غلطه ها میدونم. دلفی 2010 استفاده میکنم

a_mosavian
شنبه 28 اسفند 1389, 22:18 عصر
procedure CopyTable(TableName, NewDataBaseName, OldDataBaseName: string);
var
SQLText: string;
FieldList: string;
begin
SQLText := 'USE '+ NewDataBaseName + #13#10;
FieldList := GetTableFields(TableName);
try
if HasIdentity(TableName) then
SQLText := SQLText + 'SET IDENTITY_INSERT ' + TableName + ' ON' + #13#10;
SQLText := SQLText + 'INSERT INTO ' + TableName + ' (' + FieldList + ') SELECT '
+ FieldList + ' FROM ' + OldDataBaseName + '.dbo.' + TableName + #13#10;
if HasIdentity(TableName) then
SQLText := SQLText + 'SET IDENTITY_INSERT ' + TableName + ' OFF';
ADOConnection.Execute(SQLText);
except
ADOConnection.Execute('SET IDENTITY_INSERT ' + TableName + ' OFF');
end;
end;

function GetTableFields(TableName: string): string;
var
FS: TWideStringList;
I: Integer;
begin
FS:=TWideStringList.Create;
try
ADOConnection.GetFieldNames(TableName, FS);
for I := 0 to FS.Count - 1 do
FS.Strings[I]:= '[' + FS.Strings[I] + ']';
Result:=FS.CommaText;
finally
FS.Free;
end;
end;

function HasIdentity(TableName: string): Boolean;
var
qTemp: TADOQuery;
begin
qTemp:=TADOQuery.Create(nil);
try
qTemp.Connection:=ADOConnection;
qTemp.LockType:=ltReadOnly;
qTemp.SQL.Text:='SELECT COALESCE(OBJECTPROPERTY(OBJECT_ID(' + QuotedStr(TableName) + '), ''TableHasIdentity''),0) AS HasIdentity';
qTemp.Open;
Result:= qTemp.FieldByName('HasIdentity').AsInteger = 1;
finally
qTemp.Free;
end;
end;