Dziś pokażę w jaki prosty sposób wyeksportować dane za pomocą jednego polecenia SQL. Wykorzystamy do tego mechanizm LINKED SERVER obecny w MSSQL-u.
Pierwszym krokiem jest stworzenie łącza do zdalnej maszyny:
/****** Object: LinkedServer [MYSQL] Script Date: 09/09/2010 20:33:31 ******/
IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'MYSQL')
EXEC master.dbo.sp_dropserver @server=N'MYSQL', @droplogins='droplogins'
GO
/****** Object: LinkedServer [MYSQL] Script Date: 09/09/2010 20:33:31 ******/
EXEC master.dbo.sp_addlinkedserver
@server = N'MYSQL',
@srvproduct=N'MySQL',
@provider=N'MSDASQL',
@provstr=N'Driver=MySQL ODBC 5.1 Driver;SERVER=localhost;UID=root;PWD=tajnehaslo;DATABASE=sprzedaz;PORT=3306;CHARSET=utf8'
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'MYSQL',
@useself=N'True',
@locallogin=NULL,
@rmtuser=NULL,
@rmtpassword=NULL
załóżmy że mamy tabelkę w bazie zdefiniowaną jako:
CREATE TABLE [dbo].[tab_import](
[id] [int] IDENTITY(1,1) NOT NULL,
[O1] [varchar](30) NULL,
[L1] [varchar](70) NULL,
[O2] [varchar](30) NULL,
[L2] [varchar](70) NULL,
[O3] [varchar](30) NULL,
[L3] [varchar](70) NULL,
[O4] [varchar](30) NULL,
[L4] [varchar](70) NULL,
[O5] [varchar](30) NULL,
[L5] [varchar](70) NULL,
CONSTRAINT [PK_tab_import] PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY]
Posiadamy również tabelkę po stronie MySQL-a zdefiniowaną jaką
CREATE TABLE `tab_import` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`O1` varchar(30) DEFAULT NULL,
`L1` varchar(70) DEFAULT NULL,
`O2` varchar(30) DEFAULT NULL,
`L2` varchar(70) DEFAULT NULL,
`O3` varchar(30) DEFAULT NULL,
`L3` varchar(70) DEFAULT NULL,
`O4` varchar(30) DEFAULT NULL,
`L4` varchar(70) DEFAULT NULL,
`O5` varchar(30) DEFAULT NULL,
`L5` varchar(70) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
i chcemy przetransferować dane z bazy MSSQl do bazy MySQL. Skorzystamy w takim przypadku z możliwości INSERT INTO ... SELECT
INSERT INTO openquery (MYSQL,'select * from test.tab_import where 1 = 0')
(O1, L1, O2, L2, O3, L3, O4, L4, O5, L5)
SELECT O1, L1, O2, L2, O3, L3, O4, L4, O5, L5
FROM tab_import AS tab_import_1Ciekawostką w tym układzie jest konstrukcja zagnieżdżonego SELECT-a wykorzystywanego przez OPENQUERY. warunek w tym zapytaniu filtruje wszystkie rekordy gdyż de fakto nie są one nam do niczego potrzebne. Podobna sztuczka nie jest wskazana w przypadku gdybyśmy chcieli wykonać DELETE lub UPDATE.