2010-06-06 12 views
10

¿Hay una manera fácil de convertir Transact-SQL a MySQL?Convierte T-SQL a MySQL


Estoy intentando convertir un archivo de base de datos de símbolos de cotizaciones y nombres de empresas.

+0

Encontré esto: https://www.youtube.com/watch?v=9OHXCYRYjRs (14 sept.2013) pero aún no lo he probado. Espero que te pueda ayudar. – Nolwennig

Respuesta

19

La respuesta corta: NO

La respuesta Medio: QUIZAS

La respuesta larga: Eso depende de lo que está en su TSQL y la cantidad de tiempo y esfuerzo que desea poner en él .

TSQL no es un subconjunto del dialecto de MySQL. Entonces existe algo de TSQL para el cual no hay conversión MySQL. Sin embargo, la superposición entre los dos idiomas es bastante significativa, y hasta cierto punto la conversión es solo una cuestión de sintaxis.

Esto no es un problema nuevo, y algunas personas han intentado abordarlo. Una rápida búsqueda en Google para "tsql to mysql" produce algunos resultados prometedores, en particular este proyecto aquí, que intenta convertir los procedimientos almacenados de TSQL a MySQL:

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

Esto probablemente no va a resolver su problema por completo, pero es al menos un comienzo.

0

Dicen los demás, depende de cuánto tiempo sea tu cuerda.

Pero, le sugiero que NO desee convertir Transact-SQL a MySQL.

Si lo piensas, creo que encontrarás que quieres convertirlo a ODBC.

Y luego el año siguiente, cuando la empresa quiere que lo mueve a Oracle o Access ...

1

que acaba de lograr un script tsql.

Mi solución es:

  1. de mesa de exportación informaciones (pk esquema)
  2. datos de la tabla de exportación
  3. exportación FK

No estoy muy orgulloso de mi código, pero trabajó para mi.

4 archivos wich están en la misma carpeta:

llamada lotes wich 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" 

secuencia de comandos para exportar tsql tabla de esquema 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; 

entonces la escritura para datos 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; 

Por último guión 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; 

Lo sé, lo sé ... es muy feo ...

El objetivo de este script no es convertir a MySQL TSQL pero para exportar la base de datos de MSSQL a Mysql

En el resultado de la tabla, tendrá que ejecutar una regex replace (notepad ++) replace ", \ r \ n \ r \ n)" por "\ r \ n \ r \ n)"

En el resultado de datos, reemplace ", \ r \ n \ r \ n/" por " ; \ r \ n \ r \ n/ "

orden de ejecución: Tabla -> datos -> FK

+0

Por lo tanto, esto básicamente demuestra la respuesta corta de @ tylerl hasta ahora, por lo que puedo ver. Aunque publicar esto, de hecho, puede haberlo invalidado (si esta solución funciona bien para muchas personas, eso es). –

+0

.. parece que Mysql Workbench lo hace mejor ... – Madagaga

0

¿Cómo sobre el uso de servidores vinculados de SQL Server? Puede SELECCIONAR, INSERTAR, ACTUALIZAR y ELIMINAR datos de MySQL utilizando TSQL