Есть ли простой способ конвертировать Transact-SQL в MySQL?
Я пытаюсь преобразовать архив базы данных символов биржевого тикера и названия компаний.
Есть ли простой способ конвертировать Transact-SQL в MySQL?
Я пытаюсь преобразовать архив базы данных символов биржевого тикера и названия компаний.
Короткий ответ: НЕТ
Средний ответ: MAYBE
Длинный ответ: Это зависит от того, что в вашем TSQL и сколько времени и усилий вы хотите вложить в него.
TSQL не является подмножеством диалоги MySQL. Таким образом, существует некоторый TSQL, для которого нет преобразования MySQL. Однако перекрытие между двумя языками довольно значимо, и в определенной степени преобразование - это просто вопрос синтаксиса.
Это не новая проблема, и некоторые люди пытались ее решить. Быстрый поиск в google для tsql to mysql" дает некоторые обнадеживающие результаты, в частности этот проект здесь, который пытается преобразовать хранимые процедуры из TSQL в MySQL:
http://sourceforge.net/projects/tsql2mysql/
Это, вероятно, не решит вашу проблему полностью, но это хотя бы начало.
Я только что получил tsql script.
Мое решение:
Я не очень горжусь своим кодом, но это сработало для меня.
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 script для экспорта схемы таблиц 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;
, затем script для данных 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;
Наконец, FK script
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;
Я знаю, я знаю... это очень уродливо...
Цель этого script заключается не в преобразовании TSQL в Mysql, а в том, чтобы экспортировать базу данных из MSSQL в Mysql
В результате таблицы вам нужно будет выполнить замену регулярного выражения (notepad ++) заменить ",\r\n\r\n)" на "\ r\n\r\n)"
В результате результата замените ",\r\n\r\n/" на ";\r\n\r\n/"
Порядок выполнения: Таблица → Данные → FK
Другие говорят, это зависит от того, как долго ваш конкретный кусок строки.
Но я бы предположил, что вы НЕ хотите конвертировать Transact-SQL в MySQL.
Если вы думаете об этом, я думаю, вы обнаружите, что хотите преобразовать его в ODBC.
И затем в следующем году, когда компания хочет, чтобы вы переместили ее в Oracle или Access...
Как использовать связанные серверы SQL Server? Вы можете SELECT, INSERT, UPDATE и DELETE данные из MySQL с помощью TSQL