Marc51147: MS-SQL -> MySQL

Hallo,

ich sitze an einer Aufgabe und komem nicht weiter, wäre nett, wenn mir jemand helfen könnte :

ich soll alle 3 Minuten die letzten 5 Datensätze aus einer MS-SQL-Tabelle alle Datensätze auslesen und 1:1 in eine MySQL-Tabelle schreiben. Bereits vorhandene Datensätze sollen ohne Fehlermeldung überschrieben werden.

Die Abfrage (ich hoffe, sie funktioniert) hab ich hinbekommen, die Aktualisierung auch, aber wie schreibt man das ganze nun in die MySQL-Tabelle ?

Viele Grüße,
Marc

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="refresh" content="180">
<title>mssql-mysql.php - Detenübertragung von MS-SQL-Server nach MySQL</title>
</head>

<?php
//MS-SQL-Server
$SQLServer = "localhost";
$SQLUser = "user";
$SQLPass = "password";
$SQLDB = "db1";

//Server connect
$dbhandle = mssql_connect($SQLServer, $SQLUser, $SQLPass)
  or die("Keine Verbindung möglich: $SQLServer");

//DB auswählen
$selected = mssql_select_db($SQLDB, $dbhandle)
  or die("Couldn't open database $SQLDB");

//alle Daten auswählen, sortierung nach absteigender laufender Nummer
$query = "SELECT * FROM tabelle ORDER BY tabelle.lfd\_nr DESC LIMIT 0, 5 ";

//Abfrageergebnis
$result = mssql_query($query);
while($rows = mysql_fetch_array($result))

//connect schließen
mssql_close($dbhandle);
?>

//ausgelesene Datensätze in MySQL-DB schreiben

<?php
//MySQL-Server
$MySQLServer = "localhost";
$MySQLUser = "user";
$MySQLPass = "password";
$MySQLDB = "db2";

//Server connect
$dbhandle = mssql_connect($MySQLServer, $MySQLUser, $MySQLPass)
  or die("Keine Verbindung möglich: $MySQLServer");

//DB auswählen
$selected = mssql_select_db($MySQLDB, $dbhandle)
  or die("Couldn't open database $mySQLDB");

//und jetzt weiss ich nicht mehr weiter ....

//connect schließen
mssql_close($dbhandle);
?>

</body>
</html>

  1. Hello,

    <?php
    //MS-SQL-Server
    $SQLServer = "localhost";
    $SQLUser = "user";
    $SQLPass = "password";
    $SQLDB = "db1";

    //Server connect
    $dbhandle = mssql_connect($SQLServer, $SQLUser, $SQLPass)
      or die("Keine Verbindung möglich: $SQLServer");

    //DB auswählen
    $selected = mssql_select_db($SQLDB, $dbhandle)
      or die("Couldn't open database $SQLDB");

    //alle Daten auswählen, sortierung nach absteigender laufender Nummer
    $query = "SELECT * FROM tabelle ORDER BY tabelle.lfd\_nr DESC LIMIT 0, 5 ";

    Kann mssql jetzt auch die Limit-Klausel vertragen?
    Ich dachte bis eben, mssql könnte nur TOP?

    //Abfrageergebnis
    $result = mssql_query($query);
    while($rows = mysql_fetch_array($result))

    //connect schließen
    mssql_close($dbhandle);
    ?>

    Soweit konnte ich folgen.
    Steht denn etwas drin in $rows? Kontrollausgaben?
    Ich würde das anders schreiben...

    $result = mssql_query($query);

    if ($result)
      {
          $_table = array();
          $_row   = array();

    while($_row = mysql_fetch_array($result))
          {
              $_table[] = $_row;         ## den aktuellen Satz zur Auswahltabelle hinzufügen
          }
      }
      else
      {
          ## Fehlerbehandlung
      }

    mssql_close($dbhandle);

    //ausgelesene Datensätze in MySQL-DB schreiben

    <?php
    //MySQL-Server
    $MySQLServer = "localhost";
    $MySQLUser = "user";
    $MySQLPass = "password";
    $MySQLDB = "db2";

    //Server connect

    #> $dbhandle = mssql_connect($MySQLServer, $MySQLUser, $MySQLPass)
    #  wäre wohl besser, die MySQL-API-Funktion zu benutzen
       $dbhandle = mysql_connect($MySQLServer, $MySQLUser, $MySQLPass)

    or die("Keine Verbindung möglich: $MySQLServer");

    //DB auswählen

    #> $selected = mssql_select_db($MySQLDB, $dbhandle)
       $selected = mysql_select_db($MySQLDB, $dbhandle)

    or die("Couldn't open database $mySQLDB");

    //und jetzt weiss ich nicht mehr weiter ....

    $columnlist = 'zielspalte\_1,zielspalte\_2, ... , zielspalte\_n';

    foreach($_table as $key => $_rec)
      {
         # Voraussetzung: keine der Spalten enthält den Wert NULL oder TRUE/FALSE
         # Anderenfalls muss das Escaping diskret gehandhabt werden.

    $_rec = array_map(mysql_real_escape_string,$_rec,$dbhandle);  ## hope, that's right

    $values = "'".implode("','", $_rec)."'";

    $sql = "replace into $tablename ($columnlist) values($values)";

    $replace_ok = mysql_query($sql,$dbhandle);
         ## http://dev.mysql.com/doc/refman/5.0/en/replace.html

    ## erledigten Record aus der Aufgabentabelle entfernen
         if ($replace_ok)
         {
             unset($_table[$key);
         }
      }

    ## hier Aufgabentabelle anzeigen / auswerten
      ## bei allen noch vorhandenen Datensätzen ist was schiefgegangen

    //connect schließen

    mysql_close($dbhandle);

    ?>

    So ungefähr könnte es klappen.
    Konntes es leider eben nicht mehr ausprobieren.

    Liebe Grüße

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    1. Hallo

      //alle Daten auswählen, sortierung nach absteigender laufender Nummer
      $query = "SELECT * FROM tabelle ORDER BY tabelle.lfd\_nr DESC LIMIT 0, 5 ";

      Kann mssql jetzt auch die Limit-Klausel vertragen?

      können MS SQL-Server 2005 und älter definitiv nicht.
      SELECT * ist hier grundfalsch. Es ist eine hervorragende Idee, jede einzelne Spalte aufzuführen und gegebenenfalls mittels CONVERT() oder vergleichbarer Funktionen in ein MySQL-kompatibles Format zu bringen.

      Ja, eine robuste Übertragungsfunktion muss mit NULL-Werten, boolschen Werten und natürlich auch Datumswerten umgehen können. Von der verwendung der angejahrten mysql-Funktionen rate ich in diesem Zusammenhang ab. Der OP sollte die mysqli-Funktionen oder PDO verwenden.

      Interessant wären - wie bei Datenbankproblemen üblich - die Versionen der beiden beteiligten Datenbankmanagementsysteme.

      Freundliche Grüße

      Vinzenz

  2. Hallo Marc,

    ich soll alle 3 Minuten

    nutze den SQL-Server-Agent.

    die letzten 5 Datensätze aus einer MS-SQL-Tabelle alle Datensätze auslesen

    Was nun, die letzten fünf oder alle?

    und 1:1 in eine MySQL-Tabelle schreiben. Bereits vorhandene Datensätze sollen ohne Fehlermeldung überschrieben werden.

    Die Abfrage (ich hoffe, sie funktioniert) hab ich hinbekommen,

    Nein, die funktioniert hinten und vorne nicht.

    die Aktualisierung auch,

    Du hast die Aktualisierung hinbekommen? Wie? Wo?

    $query = "SELECT * FROM tabelle ORDER BY tabelle.lfd\_nr DESC LIMIT 0, 5 ";

    MS SQL-Server leidet - wie ich - unter einer Backtick-Allergie und kennt bis einschließlich MS SQL-Server 2005 keine LIMIT-Klausel sondern TOP - siehe Handbuch. Das hier ist MySQL-Syntax, T-SQL wird Dir Fehlermeldungen um die Ohren schlagen. Maskierungszeichen in T-SQL, die hier sowieso völlig überflüssig sind, sind die eckigen Klammern.

    SELECT * ist böse, hier sowieso. Gib die komplette Spaltenliste an. Du benötigst diese sowieso für das REPLACE-Statement, alternativ könntest Du auch INSERT ... ON DUPLICATE KEY UPDATE verwenden. Schließlich kann es erforderlich sein, die Datentypen geeignet zu konvertieren.

    Nutze Prepared Statements mit der verbesserten MySQL-Erweiterung oder PDO.

    Freundliche Grüße

    Vinzenz