简体   繁体   English

将T-SQL转换为MySQL

[英]Convert T-SQL to MySQL

Is there an easy way to convert Transact-SQL to MySQL? 有没有一种简单的方法将Transact-SQL转换为MySQL?


I am attempting to convert a database archive of stock ticker symbols and company names. 我正在尝试转换股票代码符号和公司名称的数据库存档。

The short answer: NO 简短的回答: 没有

The medium answer: MAYBE 中等答案: MAYBE

The long answer: That depends on what's in your TSQL and how much time and effort you want to put into it. 答案很长: 这取决于你的TSQL中的内容以及你想要投入多少时间和精力。

TSQL is not a subset of MySQL's dialect. TSQL不是MySQL方言的子集。 So there exists some TSQL for which there is no MySQL conversion. 所以存在一些没有MySQL转换的TSQL。 However, the overlap between the two languages is pretty significant, and to a certain degree the conversion is just a matter of syntax. 但是,两种语言之间的重叠非常重要,在某种程度上,转换只是语法问题。

This isn't a new problem, and some people have tried to tackle it. 这不是一个新问题,有些人试图解决它。 A quick google search for " tsql to mysql " yields some promising results, notably this project here, which attempts to convert stored procedures from TSQL to MySQL: 快速谷歌搜索“ tsql to mysql ”会产生一些有希望的结果,特别是这个项目,它试图将存储过程从TSQL转换为MySQL:

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

This probably won't solve your problem completely, but it's at least a start. 这可能不会完全解决您的问题,但它至少是一个开始。

This website converts to/from many sql database versions: http://www.sqlines.com/online 该网站转换为许多sql数据库版本: http//www.sqlines.com/online

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

I've just achieved a tsql script. 我刚刚实现了一个tsql脚本。

My solution is : 我的解决方案是:

  1. export table informations (schema pk) 导出表信息(模式pk)
  2. export table data 导出表数据
  3. export FK 出口FK

I'm not very proud of my code, but it worked for me. 我对我的代码并不感到自豪,但它对我有用。

4 files wich are in the same folder: 4个文件位于同一文件夹中:

Batch wich call sqlcmd 批量调用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 然后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;

then script for data mysql_export_data.sql 然后脚本为数据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 最后是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;

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 此脚本的目标不是将TSQL转换为Mysql,而是将数据库从MSSQL导出到Mysql

On the table result you'll have to execute a regex replace (notepad++) replace ",\\r\\n\\r\\n)" by "\\r\\n\\r\\n)" 在表结果上,您将必须执行正则表达式替换(记事本++)替换“,\\ r \\ n \\ r \\ n”“by”\\ r \\ n \\ r \\ n)“

On the data result replace ",\\r\\n\\r\\n/ " by ";\\r\\n\\r\\n/ " 在数据结果中,将“,\\ r \\ n \\ r \\ n / 替换为“; \\ r \\ n \\ r \\ n /

Execution order : Table -> Data -> FK 执行顺序:表 - >数据 - > FK

Are the others say, it depends how long your particular piece of string is. 其他人说,这取决于你的特定字符串的长度。

But, I would suggest that you do NOT want to convert Transact-SQL to MySQL. 但是,我建议您不要将Transact-SQL转换为MySQL。

If you think about it, I think that you will find that you want to convert it to ODBC . 如果你考虑一下,我认为你会发现你想将它转换为ODBC

And then next year, when the company wants you to move it to Oracle, or Access ... 然后明年,公司希望您将其转移到Oracle或Access ...

How about using SQL Server Linked Servers ? 如何使用SQL Server链接服务器? You can SELECT, INSERT, UPDATE and DELETE data from MySQL using TSQL 您可以使用TSQL从MySQL中选择,插入,更新和删除数据

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM