¿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.
¿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.
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.
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 ...
que acaba de lograr un script tsql.
Mi solución es:
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
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). –
.. parece que Mysql Workbench lo hace mejor ... – Madagaga
¿Cómo sobre el uso de servidores vinculados de SQL Server? Puede SELECCIONAR, INSERTAR, ACTUALIZAR y ELIMINAR datos de MySQL utilizando TSQL
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