{"id":690,"date":"2007-08-21T12:10:39","date_gmt":"2007-08-21T10:10:39","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/2007\/08\/21\/sql-server\/fieser-fehler-im-tablediff"},"modified":"2007-08-21T12:11:58","modified_gmt":"2007-08-21T10:11:58","slug":"fieser-fehler-im-tablediff","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2007\/08\/21\/sql-talk\/sql-server\/fieser-fehler-im-tablediff","title":{"rendered":"fieser Fehler im Tablediff"},"content":{"rendered":"<p>Neulich stellte ich das Tool <a href=\"http:\/\/www.glorf.it\/blog\/2006\/12\/28\/sql-talk\/sql-tools\/sql2005-tablediff\">TableDiff<\/a> des SQL-Servers-2005 vor. Leider hat es einen ganz fiesen Fehler: <\/p>\n<p>L&#228;sst man das Werkzeug TableDiff ein Fix-File (&quot;-f&quot;) erzeugen, also ein Skript mit den INSERT\/UPDATE\/DELETE-Befehlen, die Datenbank 2 auf den Stand der ersten heben, dann k&#246;nnen dabei fehlerhafte SQL-Befehle erzeugt werden. Die Werte vom Typ NUMERIC liefern falsche Ergebnisse, wenn das Tool von einem Benutzer mit deutschen L&#228;ndereinstellungen ausgef&#252;hrt wird. Als Dezimalpunkt wird dann &quot;,&quot; anstelle von &quot;.&quot; verwendet, was in SQL nat&#252;rlich syntaktisch falsch ist.<\/p>\n<p>Anstelle von (numerischer Wert: 12.34)<br \/>\n<code lang=\"sql\">INSERT INTO [dbo].[difftest] ([id],[num]) VALUES (1,12.34) <\/code><br \/>\nkommt leider (numerischer Wert: 12,34)<br \/>\n<code lang=\"sql\">INSERT INTO [dbo].[difftest] ([id],[num]) VALUES (1, 12,34)<\/code><\/p>\n<p>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&#228;ndereinstellungen abh&#228;ngt. Er h&#228;tte einfach eine feste L&#228;ndereinstellung vorsehen sollen.<\/p>\n<p>Microsoft hat einen Bugfix dazu abgelehnt. Jeder der das Tool in Europa einsetzen will, der muss sich etwas &#252;berlegen. Wer einfach seine L&#228;ndereinstellungen &#228;ndern kann, ist fein raus. Bei mir geht das nicht.<br \/>\nIch werde mir so behelfen:<\/p>\n<ul>\n<li>Ich legte einen lokalen Benutzer &quot;englisch&quot; an. Einmal musste ich mich anmelden und die L&#228;ndereinstellungen auf us-amerikanisch setzen.<\/li>\n<li>Jetzt starte ich meine Dos-Box immer unter dem Benutzer. Wenn ich dann das Tablediff aufrufe, sind die Befehle richtig.<\/li>\n<li>Dazu nutze ich eine kleine selbstgeschriebene <a href=\"http:\/\/www.glorf.it\/blog\/2006\/12\/03\/windows-tools\/runas-gleiches-recht-fuer-alle\">RunAs<\/a>-Variante, der man gleich ein Passwort mitgeben kann. So kann ich eine Verkn&#252;pfung hinterlegen, die die Dos-Box sofort (ohne l&#228;stigen Dialog) startet. <\/li>\n<\/ul>\n<p>Das ist nat&#252;rlich nur eine Notl&#246;sung, aber was soll man machen&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neulich stellte ich das Tool TableDiff des SQL-Servers-2005 vor. Leider hat es einen ganz fiesen Fehler: L&#228;sst man das Werkzeug TableDiff ein Fix-File (&quot;-f&quot;) erzeugen, also ein Skript mit den INSERT\/UPDATE\/DELETE-Befehlen, die Datenbank 2 auf den Stand der ersten heben, dann k&#246;nnen dabei fehlerhafte SQL-Befehle erzeugt werden. Die Werte vom Typ NUMERIC liefern falsche Ergebnisse, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/690"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=690"}],"version-history":[{"count":0,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/690\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=690"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}