2 farklı mssql server arasında veri aktarımı

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
veski
Üye
Mesajlar: 37
Kayıt: 17 Nis 2006 05:02
Konum: denizli

2 farklı mssql server arasında veri aktarımı

Mesaj gönderen veski »

arkadaşlar elimde 2 farklı mssql server ve bunlar üzerinde yer alan 2 farklı veritabanı var. 1.serverde yeralan veritabanındaki bir tablodan bilgiyi okuyup diğer serverde yer alan 2. veritabanındaki bir tabloya sql komutu ile nasıl veri aktarılabilir.

Acil yardıma ihtiyacım var
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: 2 farklı mssql server arasında veri aktarımı

Mesaj gönderen sabanakman »

Aynı cevabı buradan da verelim :wink: . Bunun için 2 yol önerebilirim. Öncelikle örneklerin,
Server adı olarak DIGERSERVER (eğer instancename varsa DIGERSERVER\INSTANCENAME olarak ele alınabilir),
Bağlantı kuran kullanıcı adı olarak sa sql kullanıcısı,
bu sql kullanıcı şifresinin de SiFRE,
bağlanılacak veritabanı adı olarak HASTANE veritabanı ve
buradaki HASTALAR tablosu olduğunu var sayarak örneklediğimi belirtmeliyim.

-sp_addlinkedserver ve sp_addlinkedsrvlogin komutları ile diğer sql server mevcut sisteme server olarak eklenir ve diğer server ismi kullanarak sorgulama yapma imkanı doğmuş olur.

Kod: Tümünü seç

exec sp_addlinkedserver @server='KENDIM_DIGERSERVERA_AD_VERDIM', @srvproduct='', @provider='SQLOLEDB', @datasrc='DIGERSERVER'

exec sp_addlinkedsrvlogin 'KENDIM_DIGERSERVERA_AD_VERDIM', 'False', Null, 'sa', 'SiFRE'
artık diğer server kayıt edilmiş durumdadır. Oradaki veritabanlarını select * from [SERVER_ADI].[DB ADI].[OWNER].[TABLO] yapısıyla elde edebiliriz. Bir kaç örnek..:

Kod: Tümünü seç

select * from KENDIM_DIGERSERVERA_AD_VERDIM.master.dbo.sysdatabases

select * from KENDIM_DIGERSERVERA_AD_VERDIM.HASTANE.dbo.HASTALAR
şeklinde sorgularla sorgulayabiliriz.

---------------------------------------------------------------

-Önereceğim 2. yolda ise OPENDATASOURCE veya OPENROWSET fonksiyonları ile server kaydetmeye gerek kalmadan direkt veri çekmeyi sağlayan kodlar olacak. Tabi bu 2 fonksiyon sadece SQL Server değil tüm ODBC veya OLE DB Provider bağlantılarını desteklediği için diğer ortamlardan (Access, Excel, ... sürücüsü yüklü olan diğer veritabanları) veri çekebilmektedir.

OPENDATASOURCE örneği..:

Kod: Tümünü seç

select * from OPENDATASOURCE('SQLOLEDB','Data Source=DIGERSERVER;User ID=sa;Password=SiFRE').master.dbo.sysdatabases

select * from OPENDATASOURCE('SQLOLEDB','Data Source=DIGERSERVER;User ID=sa;Password=SiFRE').HASTANE.dbo.HASTALAR
OPENROWSET örneği..:

Kod: Tümünü seç

select * from OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=DIGERSERVER;UID=sa;PWD=SiFRE',master.dbo.sysdatabases) AS tbl

select * from OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=DIGERSERVER;UID=sa;PWD=SiFRE',HASTANE.dbo.HASTALAR) AS tbl
---------------------------------------------------------------

Artık insert into sorgusunda yukarıdaki gibi select sorgu kullanarak diğer taraftan kayıt getirebilirsiniz.

Kod: Tümünü seç

insert into HASTALAR (Ad, Soyad)
select Ad, Soyad from KENDIM_DIGERSERVERA_AD_VERDIM.HASTANE.dbo.HASTALAR
veya

Kod: Tümünü seç

insert into HASTALAR (Ad, Soyad) 
select Ad, Soyad from OPENDATASOURCE('SQLOLEDB','Data Source=DIGERSERVER;User ID=sa;Password=SiFRE').HASTANE.dbo.HASTALAR
veya

Kod: Tümünü seç

insert into HASTALAR (Ad, Soyad) 
select Ad, Soyad from OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=DIGERSERVER;UID=sa;PWD=SiFRE',HASTANE.dbo.HASTALAR) AS tablo
gibi örnekler çoğaltılabilir.

Uyarmak gerekirse burada bilgi çekmek için yapılan ilk bağlantılarda biraz fazla bekleme olabilir ama daha sonraki işlemlerde bir kere bağlantı sağlandığı için bu ilk bağlantıdaki gibi yavaşlık söz konusu olmayacaktır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla