2010-06-06 14 views
10

Czy istnieje łatwy sposób konwersji Transact-SQL na MySQL?Konwersja T-SQL na MySQL


Próbuję przekonwertować archiwum bazy danych symboli giełdowych i nazw firm.

+0

Znalazłem to: https://www.youtube.com/watch?v=9OHXCYRYjRs (14 września 2014), ale jeszcze nie testowałem. Mam nadzieję, że to może ci pomóc. – Nolwennig

Odpowiedz

19

Krótka odpowiedź: NO

Odpowiedź medium: MOŻE

Długa odpowiedź: To zależy co masz w TSQL i jak chcesz, aby umieścić w nim dużo czasu i wysiłku .

TSQL nie jest podzbiorem dialektu MySQL. Tak więc istnieje pewne TSQL, dla których nie ma konwersji MySQL. Jednak nakładanie się tych dwóch języków jest dość znaczące i do pewnego stopnia konwersja jest tylko kwestią składni.

To nie jest nowy problem, a niektórzy próbowali go rozwiązać. Szybkie wyszukiwanie google dla „tsql to mysql” daje obiecujące wyniki, zwłaszcza tym projekcie tutaj, który próbuje konwertować procedur przechowywanych z TSQL do MySQL:

http://sourceforge.net/projects/tsql2mysql/

To prawdopodobnie nie rozwiąże problemu całkowicie, ale to przynajmniej początek.

0

Czy inni mówią, zależy to od długości danego kawałka sznurka.

Ale sugerowałbym, że NIE chcesz konwertować języka Transact-SQL na MySQL.

Jeśli myślisz o tym, myślę, że przekonasz się, że chcesz przekonwertować go na ODBC.

A potem następny rok, gdy firma chce, aby przenieść go do Oracle lub dostęp ...

1

Właśnie osiągnęliśmy skrypt tsql.

Moje rozwiązanie to:

  1. informacje stół eksport (PK schema)
  2. dane tabeli eksport
  3. eksport FK

nie jestem bardzo dumny z mojego kodu, ale pracował dla mnie.

4 plików jakie są w tym samym folderze:

Batch wich wezwanie Sqlcmd

@echo off 

set host= (local) 
set schema=database 
set user=user 
set pass=pass 

cd %cd% 
rem tables 
SQLCMD -S %host% -d %schema% -U %user% -P %pass% -s "" -h-1 -W -i "%CD%\mysql_export_table.sql" -o "%CD%\%schema%_tables.sql" 
rem data 
SQLCMD -S %host% -d %schema% -U %user% -P %pass% -s "" -h-1 -W -i "%CD%\mysql_export_data.sql" -o "%CD%\%schema%_data.sql" 
rem fk 
SQLCMD -S %host% -d %schema% -U %user% -P %pass% -s "" -h-1 -W -i "%CD%\mysql_export_fk.sql" -o "%CD%\%schema%_fk.sql" 

następnie tsql skrypt do eksportowania tabeli schematu mysql_export_table.sql

SET NOCOUNT ON; 
SET QUOTED_IDENTIFIER ON; 
DECLARE @table_name as varchar(max) 



DECLARE view_cursor CURSOR FOR 
SELECT Table_name FROM information_schema.tables where TABLE_TYPE = 'BASE TABLE' and table_name not like 'sys%' 

OPEN view_cursor 

FETCH NEXT FROM view_cursor 
INTO @table_name 

WHILE @@FETCH_STATUS = 0 
BEGIN 


    select '' 
    select '/*** TABLE '[email protected]_name+' ***/ ' 
    select 'DROP TABLE IF EXISTS ' + QUOTENAME(@table_name, '`') + ';' 
    select '' 
    select 'CREATE TABLE ' + QUOTENAME(@table_name, '`') + ' (' 

-- column declaration 

    select 
    CHAR(9) 
+ QUOTENAME(Column_Name, '`') + ' ' + 
DATA_TYPE 
+ 
coalesce('(' + cast(coalesce(replace(CHARACTER_MAXIMUM_LENGTH, -1, 2500), null) as varchar) + ')', '') 
+ ' ' + 
case IS_NULLABLE WHEN 'NO' then 'NOT ' else '' end + 'NULL' 
+ ' ' + 
case when COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 then 'AUTO_INCREMENT' else '' end 
--coalesce('DEFAULT ' + replace(replace(replace(COLUMN_DEFAULT, '(', ''), ')', ''), 'getdate', null), '') 
+',' 
FROM information_schema.COLUMNS where TABLE_NAME = @table_name 
-- PK 
select coalesce('PRIMARY KEY (' +STUFF((
SELECT distinct ', ' + QUOTENAME(Col.Column_Name,'`') from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab inner join 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col on Col.Constraint_Name = Tab.Constraint_Name AND Col.Table_Name = Tab.Table_Name 
WHERE   
    Constraint_Type = 'PRIMARY KEY ' 
    AND Col.Table_Name = @table_name 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '')+ ')', '') 

select ') Engine InnoDB;' 

    FETCH NEXT FROM view_cursor 
    INTO @table_name 
END 
CLOSE view_cursor; 
DEALLOCATE view_cursor; 

następnie skrypt dla danych mysql_export_data.sql

SET NOCOUNT ON; 
SET QUOTED_IDENTIFIER ON; 
DECLARE @table_name as varchar(max) 
declare @column_names as varchar(max) 


DECLARE view_cursor CURSOR FOR 
SELECT Table_name FROM information_schema.tables where TABLE_TYPE = 'BASE TABLE' and table_name not like 'sys%' 

OPEN view_cursor 

FETCH NEXT FROM view_cursor 
INTO @table_name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    select '' 
    select '/*** TABLE '[email protected]_name+' ***/ ' 

    select @column_names = STUFF((SELECT ', ' + QUOTENAME(Column_Name, '`') from INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = @table_name ORDER BY ORDINAL_POSITION FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '') 

    select 'REPLACE INTO '+ QUOTENAME(@table_name, '`') +'('+ @column_names+ ') VALUES ' 
    select @column_names = 'SELECT DISTINCT ''('+ STUFF((SELECT ', '','''''' + coalesce(replace(cast(' + QUOTENAME(Column_Name) +' as varchar(200)), '''''''',''''), '''') + ''''''''' from INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = @table_name ORDER BY ORDINAL_POSITION FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 4, '') + '+''),'' FROM ' + QUOTENAME(@table_name) 
    exec (@column_names) 

    FETCH NEXT FROM view_cursor 
    INTO @table_name 
END 
CLOSE view_cursor; 
DEALLOCATE view_cursor; 

Wreszcie skrypt FK

SET NOCOUNT ON; 
SET QUOTED_IDENTIFIER ON; 
-- FK 
-- foreign keys 
SELECT 
    'ALTER TABLE', 
    ' '+ QUOTENAME(OBJECT_NAME(fkcol.[object_id]), '`'), 
--ADD CONSTRAINT `recherche_ibfk_1` FOREIGN KEY (`notaire_compte_id`) REFERENCES `notaire_compte` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 
    ' ADD CONSTRAINT', 
    ' ' + QUOTENAME(fk.name, '`'), 
    ' FOREIGN KEY', 
    ' (' + QUOTENAME(fkcol.name, '`') +')', 
    ' REFERENCES',  
    ' ' + QUOTENAME(OBJECT_NAME(pkcol.[object_id]), '`'), 
    ' (' + QUOTENAME(pkcol.name, '`') + ');', 
    CHAR(13) 

FROM sys.foreign_keys AS fk 
INNER JOIN sys.foreign_key_columns AS fkc 
ON fk.[object_id] = fkc.constraint_object_id 
INNER JOIN sys.columns AS fkcol 
ON fkc.parent_object_id = fkcol.[object_id] 
AND fkc.parent_column_id = fkcol.column_id 
INNER JOIN sys.columns AS pkcol 
ON fkc.referenced_object_id = pkcol.[object_id] 
AND fkc.referenced_column_id = pkcol.column_id 
ORDER BY fkc.constraint_column_id; 

Wiem, wiem ... to bardzo brzydki ...

Celem tego skryptu nie jest konwersja TSQL do MySQL ale aby wyeksportować bazę danych z MSSQL do Mysql

W wyniku tabeli będziesz musiał wykonać wyrażenie zastępujące (notatnik ++) zamień ", \ r \ n \ r \ n)" przez "\ r \ n \ r \ n)"

Na wynik danych zamień ", \ r \ n \ r \ n/" przez " ; \ r \ n \ r \ n/ "

realizacji zlecenia: Tabela -> Dane -> FK

+0

To, jak na razie, udowadnia do tej pory krótką odpowiedź @ tylerl. Chociaż twoje ogłoszenie to w istocie mogło go unieważnić (jeśli to rozwiązanie sprawdza się dobrze dla wielu ludzi). –

+0

.. wydaje się, że Mysql Workbench robi to lepiej ... – Madagaga

0

Jak o użyciu SQL Server serwerów połączonych? Możesz SELECT, INSERT, UPDATE i DELETE dane z MySQL za pomocą TSQL