MS-SQL -> MySQL
Marc51147
- php
0 Tom1 Vinzenz Mai
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>
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 * FROMtabelle
ORDER BYtabelle
.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
Hallo
//alle Daten auswählen, sortierung nach absteigender laufender Nummer
$query = "SELECT * FROMtabelle
ORDER BYtabelle
.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
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 BYtabelle
.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