2010-06-06 4 views
10

Gibt es eine einfache Möglichkeit, Transact-SQL in MySQL zu konvertieren?Konvertieren von T-SQL in MySQL


Ich versuche, eine Datenbank Archiv von Börsenticker-Symbole und Firmennamen zu konvertieren.

+0

SELECT, INSERT, UPDATE und DELETE Daten, die ich gefunden habe: https://www.youtube.com/watch?v=9OHXCYRYjRs (14 Sept.2013), aber ich habe noch nicht getestet. Ich hoffe, es kann dir helfen. – Nolwennig

Antwort

19

Die kurze Antwort: NO

Die mittlere Antwort: MAYBE

Die lange Antwort: das hängt davon ab, was in Ihrem TSQL ist und wie viel Zeit und Mühe Sie hineingesteckt .

TSQL ist keine Teilmenge des MySQL-Dialekts. Es gibt also einige TSQL, für die es keine MySQL-Konvertierung gibt. Die Überlappung zwischen den beiden Sprachen ist jedoch ziemlich signifikant, und die Konvertierung ist zu einem gewissen Grad nur eine Frage der Syntax.

Dies ist kein neues Problem, und einige Leute haben versucht, es anzugehen. Eine schnelle Google-Suche nach „tsql to mysql“ liefert einige vielversprechende Ergebnisse, insbesondere das Projekt hier, die gespeicherten Prozeduren von TSQL zu MySQL zu konvertieren versucht:

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

Dies wird wahrscheinlich das Problem nicht vollständig lösen, aber es ist zumindest ein Anfang.

0

Sind die anderen sagen, es hängt davon ab, wie lange Ihr bestimmtes Stück Schnur ist.

Aber ich würde vorschlagen, dass Sie nicht Transact-SQL zu MySQL konvertieren möchten. Wenn Sie darüber nachdenken, werden Sie feststellen, dass Sie es in ODBC konvertieren möchten.

Und dann im nächsten Jahr, wenn das Unternehmen will, dass Sie es zu Oracle oder Access bewegen ...

1

Ich habe erreicht nur ein Tsql Skript.

Meine Lösung ist:

  1. Exporttabelle Informationen (Schema pk)
  2. Exporttabellendaten
  3. Export FK

Ich bin nicht sehr stolz auf mein Code, aber es hat für mich gearbeitet.

4-Dateien wich sind im selben Ordner:

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

dann Tsql Skript Tabellenschema 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; 

dann Skript zu exportieren für Daten 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; 

Schließlich FK Skript

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; 

Ich weiß, ich weiß ... es ist sehr hässlich ...

Das Ziel dieses Skript nicht TSQL zu Mysql konvertieren aber um Datenbank von MSSQL nach Mysql

zu exportieren Auf dem Tabellenresultat müssen Sie einen Regexreplace (Notizblock ++)ausführenersetzen ", \ r \ n \ r \ n)"

Auf das Datenergebnis ersetzen ", \ r \ n \ r \ n/" durch " ; \ r \ n \ r \ n/ "

Ausführungsreihenfolge: Tabelle -> Daten -> FK

+0

Also, das beweist im Grunde @ tylerls kurze Antwort soweit, soweit ich das beurteilen kann. Obwohl Ihr Beitrag dies tatsächlich ungültig gemacht haben könnte (wenn diese Lösung für viele Leute gut funktioniert, das ist). –

+0

.. es scheint, dass Mysql Workbench es besser macht ... – Madagaga

0

Wie über SQL Server Linked Server verwenden? Sie können Daten von MySQL mit TSQL

Verwandte Themen