【问题标题】:Convert T-SQL to MySQL将 T-SQL 转换为 MySQL
【发布时间】:2011-02-28 12:11:08
【问题描述】:

有没有一种简单的方法可以将Transact-SQL 转换为 MySQL?


我正在尝试转换股票代码和公司名称的数据库存档。

【问题讨论】:

    标签: mysql tsql


    【解决方案1】:

    本网站转换为/从许多 sql 数据库版本: http://www.sqlines.com/online

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

    【讨论】:

    • Sqlines 是我尝试过的最好的免费工具。不完美,但可以让你到达那里的 90%。您也可以下载离线版本。
    【解决方案2】:

    如何使用 SQL Server 链接服务器?您可以使用 TSQL 从 MySQL 中选择、插入、更新和删除数据

    【讨论】:

      【解决方案3】:

      我刚刚实现了一个 tsql 脚本。

      我的解决办法是:

      1. 导出表信息(schema pk)
      2. 导出表格数据
      3. 导出 FK

      我对我的代码不是很自豪,但它对我有用。

      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

      在表格结果中,您必须执行正则表达式替换(记事本++) 将“,\r\n\r\n)”替换为“\r\n\r\n)”

      在数据结果中,将“,\r\n\r\n/”替换为“;\r\n\r\n/

      执行顺序:表格 -> 数据 -> FK

      【讨论】:

      • 所以,据我所知,这基本上证明了@tylerl 的简短回答。尽管您的发布实际上可能已使其无效(如果此解决方案对许多人都有效,那就是)。
      【解决方案4】:

      其他人是否说,这取决于您的特定字符串有多长。

      但是,我建议您不要将 Transact-SQL 转换为 MySQL。

      如果你仔细想想,我想你会发现你想把它转换成ODBC

      然后明年,当公司希望你将其转移到 Oracle 或 Access 时......

      【讨论】:

        【解决方案5】:

        简短的回答:

        中等答案:可能

        长答案:这取决于您的 TSQL 中的内容以及您想要投入多少时间和精力。

        TSQL 不是 MySQL 方言的子集。所以存在一些没有 MySQL 转换的 TSQL。但是,两种语言之间的重叠非常显着,在某种程度上,转换只是语法问题。

        这不是一个新问题,有些人已经尝试解决它。在谷歌上快速搜索“tsql to mysql”会产生一些有希望的结果,尤其是这里的这个项目,它试图将存储过程从 TSQL 转换为 MySQL:

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

        这可能无法完全解决您的问题,但至少是一个开始。

        【讨论】:

        • 简短的回答是否定的。中等答案是否定的。长答案是否定的。没有简单的方法。通常,根本没有办法。它们不支持相同的功能集。由于功能差异,整个实现可能必须完全不同才能实现相同的功能。对有序阻塞操作至关重要的锁定提示和机制是不同的。它们是两种完全不同的数据库技术。他们做类似的事情,但这就像认为您可以“轻松”在 Windows 上开箱即用地运行 Mac 二进制文件一样愚蠢。没办法。
        猜你喜欢
        • 2013-11-08
        • 2020-11-18
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 2010-12-02
        相关资源
        最近更新 更多