Neulich stellte ich das Tool TableDiff des SQL-Servers-2005 vor. Leider hat es einen ganz fiesen Fehler:
Lässt man das Werkzeug TableDiff ein Fix-File ("-f") erzeugen, also ein Skript mit den INSERT/UPDATE/DELETE-Befehlen, die Datenbank 2 auf den Stand der ersten heben, dann können dabei fehlerhafte SQL-Befehle erzeugt werden. Die Werte vom Typ NUMERIC liefern falsche Ergebnisse, wenn das Tool von einem Benutzer mit deutschen Ländereinstellungen ausgeführt wird. Als Dezimalpunkt wird dann "," anstelle von "." verwendet, was in SQL natürlich syntaktisch falsch ist.
Anstelle von (numerischer Wert: 12.34)
INSERT INTO [dbo].[difftest] ([id],[num]) VALUES (1,12.34)
kommt leider (numerischer Wert: 12,34)
INSERT INTO [dbo].[difftest] ([id],[num]) VALUES (1, 12,34)
Microsoft erkannte den Bug recht schnell an. Der Entwickler hatte bei der Ausgabe einfach nur ToString() angegeben ohne daran zu denken, dass die Konvertierungsfunktion von den Ländereinstellungen abhängt. Er hätte einfach eine feste Ländereinstellung vorsehen sollen.
Microsoft hat einen Bugfix dazu abgelehnt. Jeder der das Tool in Europa einsetzen will, der muss sich etwas überlegen. Wer einfach seine Ländereinstellungen ändern kann, ist fein raus. Bei mir geht das nicht.
Ich werde mir so behelfen:
- Ich legte einen lokalen Benutzer "englisch" an. Einmal musste ich mich anmelden und die Ländereinstellungen auf us-amerikanisch setzen.
- Jetzt starte ich meine Dos-Box immer unter dem Benutzer. Wenn ich dann das Tablediff aufrufe, sind die Befehle richtig.
- Dazu nutze ich eine kleine selbstgeschriebene RunAs-Variante, der man gleich ein Passwort mitgeben kann. So kann ich eine Verknüpfung hinterlegen, die die Dos-Box sofort (ohne lästigen Dialog) startet.
Das ist natürlich nur eine Notlösung, aber was soll man machen…