Pokazywanie postów oznaczonych etykietą MySQL. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą MySQL. Pokaż wszystkie posty

czwartek, 9 września 2010

Eksport danych z MSSQL-a bezpośrednio do MySQL-a

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_1
Ciekawostką 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.

piątek, 13 sierpnia 2010

Now Available: SQL Server Migration Assistant for MySQL! - Brian Swan - Site Home - MSDN Blogs

Now Available: SQL Server Migration Assistant for MySQL! - Brian Swan - Site Home - MSDN Blogs

Bardzo ciekawe narzędzie służące do migrowania bazy danych MySQL do MSSQL-a. Dzięki temu kreatorowi można wykonać to zadanie w miarę szybko i bezboleśnie.

niedziela, 9 sierpnia 2009

Parametryzacja ADO

Pracując z bazami danych uświadamiamy sobie w pewnym momencie, że pewne operacje powtarzają się lub wręcz są identyczne. Dużym ułatwieniem w takim wypadku może być parametryzacja zapytań przesyłanych do bazy zarówno tych stricte SQL-owych jak i procedur składowanych po stronie serwera.

poniedziałek, 23 marca 2009

Udawanie Rank w MySQL

Dziś po chwili szperania w internecie udało mi się zbudować zapytanie w MySQL-u posiadające ciekawą konstrukcję podobną do RANK z MSSQL-a. umożliwiła mi ona zliczenie elementów w bieżącym zapytaniu w sposób sekwencyjny. Oto kod SQL:

select * from (

SELECT
r2.`id`,
r2.`photo_id`,
case
when
case when r2.`photo_id` <> @grupa then 1
else 0 end = 1 then @rownum:= 0
else @rownum:= @rownum
end as tr,
@rownum:= @rownum+ 1 AS rank,
@grupa := r2.`photo_id` as gr
FROM
`photos_comments` r2, (SELECT @rownum := 0, @grupa := '', @grupa ) r
GROUP BY
r2.`photo_id`,
rank
) as tab_rank, `photos`

where (tab_rank.rank <=5) and (`photos`.`id` = tab_rank.`photo_id`)

Na stronie http://forums.devshed.com/mysql-help-4/mysql-rank-function-487657.html znalazłem coś takiego:


SET @rank = 1, @prev_val = NULL, @prev_rank = NULL;
SELECT rank FROM
(
SELECT @rank := IF(@prev_val!=uXP,@prev_rank+1,@rank) AS rank
, @prev_val := uXP AS uXP
, @prev_rank := @rank AS prevRank
, t.uID
, t.uName
FROM
(
SELECT uID, uName, SUM(tblbase.basXP) AS uXP
FROM tbluser INNER JOIN tblbase ON tbluser.uID = tblbase.basUserID
GROUP BY tblbase.basUserID
ORDER BY uXP DESC
) AS t
) AS showRank WHERE uID = 5

To chyba esencja tego czym można określić miano Rank dla MySQL

sobota, 14 marca 2009

MySQL i procedury

Dziś zdarzyło mi się popełnić procedurę w MySQL-u. O dziwo nawet działa :) ale co mi tam, jest prosta jak budowa cepa i ma zrealizować jedno zadanie: a mianowicie wylosować jeden element z tabeli o nieciągłym numerowaniu w jak najmniejszej ilości prób. A oto Ona

CREATE DEFINER = 'root'@'localhost'
PROCEDURE `new_proc`(
OUT wynik CHAR,
OUT ile INTEGER(11)
)
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
COMMENT ''
BEGIN

declare rnd DOUBLE;
DECLARE ID_element int;
declare ile_elem int;
declare wyn_zap char(20);


select max(id) INTO ile_elem from `documents`;

set ile = 0;

REPEAT

set rnd = RAND() * ile_elem;

set ID_element = rnd;
set ile = ile + 1;
select `tag` INTO wyn_zap
from `documents`
where `documents`.`id` = ID_element
limit 1;

until (wyn_zap is not NULL) end repeat;

set wynik = left(wyn_zap,1);

END;