Конвертировать T-SQL в MySQL - PullRequest
13 голосов
/ 07 июня 2010

Существует ли простой способ преобразования Transact-SQL в MySQL?


Я пытаюсь преобразовать архив базы данных биржевых символов и названий компаний.

Ответы [ 5 ]

21 голосов
/ 07 июня 2010

Краткий ответ: НЕТ

Средний ответ: МОЖЕТ

Длинный ответ: Это зависит от того, что находится в вашем TSQL и сколько времени и усилий вы хотите в него потратить.

TSQL не является подмножеством диалекта MySQL. Таким образом, существует некоторый TSQL, для которого нет преобразования MySQL. Однако совпадение между двумя языками довольно существенно, и в определенной степени преобразование является лишь вопросом синтаксиса.

Это не новая проблема, и некоторые люди пытались ее решить. Быстрый поиск в Google по запросу " tsql to mysql " дает некоторые многообещающие результаты, особенно этот проект, который пытается преобразовать хранимые процедуры из TSQL в MySQL:

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

Возможно, это не решит вашу проблему полностью, но это, по крайней мере, начало.

2 голосов
/ 28 марта 2018

Этот веб-сайт конвертирует во многие версии базы данных sql: http://www.sqlines.com/online

TSQL, MySql, Oracle, DB2, Sybase, Informix, Hive, MariaDB, PostgreSQL, RedShift, TeraData, Greenplum, Netezza

1 голос
/ 15 апреля 2014

Я только что достиг сценария tsql.

Мое решение:

  1. Экспорт таблицы данных (схема ПК)
  2. данные таблицы экспорта
  3. экспорт ФК

Я не очень горжусь своим кодом, но он работал для меня.

4 файла, которые находятся в одной папке:

Пакет, который вызывает 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" 

затем скрипт tsql для экспорта схемы таблицы 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 '+@table_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;

затем скрипт для данных 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 '+@table_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;

Наконец 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;

Я знаю, я знаю ... это очень уродливо ...

Цель этого сценария - не преобразовать TSQL в Mysql, а экспортировать базу данных из MSSQL в Mysql

Для результата таблицы вам нужно выполнить регулярное выражение (notepad ++) заменить ", \ r \ n \ r \ n)" на "\ r \ n \ r \ n)"

В результатах данных заменить ", \ r \ n \ r \ n / " на "; \ r \ n \ r \ n / "

Порядок выполнения: Таблица -> Данные -> FK

0 голосов
/ 17 августа 2016

Как насчет использования связанных серверов SQL Server? Вы можете выбирать, вставлять, обновлять и удалять данные из MySQL, используя TSQL

0 голосов
/ 07 июня 2010

Говорят ли другие, это зависит от длины вашего конкретного куска нити.

Но я бы сказал, что вы НЕ хотите конвертировать Transact-SQL в MySQL.

Если вы подумаете об этом, я думаю, вы обнаружите, что хотите преобразовать его в ODBC .

А потом в следующем году, когда компания захочет, чтобы вы перевели ее в Oracle или Access ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...