Convert T-SQL to MySQL

后端 未结 5 1419
感情败类
感情败类 2020-12-06 00:57

Is there an easy way to convert Transact-SQL to MySQL?


I am attempting to convert a database archive of stock ticker symbols and company names.

5条回答
  •  醉话见心
    2020-12-06 01:40

    I've just achieved a tsql script.

    My solution is :

    1. export table informations (schema pk)
    2. export table data
    3. export FK

    I'm not very proud of my code, but it worked for me.

    4 files wich are in the same folder:

    Batch wich call 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" 
    

    then tsql script to export table schema 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;
    

    then script for data 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;
    

    Finally 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;
    

    I know, i know... it's very ugly ...

    The goal of this script is not to convert TSQL to Mysql but to export database from MSSQL to Mysql

    On the table result you'll have to execute a regex replace (notepad++) replace ",\r\n\r\n)" by "\r\n\r\n)"

    On the data result replace ",\r\n\r\n/" by ";\r\n\r\n/"

    Execution order : Table -> Data -> FK

提交回复
热议问题