{"id":638,"date":"2010-09-22T21:34:18","date_gmt":"2010-09-22T20:34:18","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=638"},"modified":"2010-09-13T22:00:44","modified_gmt":"2010-09-13T21:00:44","slug":"nette-falle-im-sql-server-kompatibilitaetsgrad","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/09\/22\/nette-falle-im-sql-server-kompatibilitaetsgrad\/","title":{"rendered":"Nette Falle im SQL-Server: Der Kompatibilit\u00e4tsgrad"},"content":{"rendered":"<p>Nach einem der letzten Updates unserer Software meldete uns ein Kunde einen SQL Fehler, der bei einer bestimmten Operation auftrat.\u00a0Er setzt den <em>MS-SQL Server 2008 <\/em>ein.<\/p>\n<p>OK, meine Testumgebung hat drei Server von <em>SQL 2000<\/em>, \u00fcber <em>2005 <\/em>bis <em>2008 R2<\/em>. Keine der Testumgebungen brachte bei der entsprechenden gleichen Operation einen Fehler \ud83d\ude15 Gut oder besser schlecht&#8230; Der Kunde bekommt nun eine Fehlermeldung und auch wenn Kunden meistens ja nicht recht haben wenn sie Fehler melden \ud83d\ude00\u00a0schaute ich mir dennoch alle SQL Befehle etwas genauer an, die meine Software da ausl\u00f6ste.<br \/>\nIn dem entsprechenden Teil meiner wurde nach Benutzerangaben ein relativ komplexer Query durch einen Abfragegenerator zusammengebaut. Darunter fand sich auch der folgende Subquery, als Teil der gesamten Abfrage:<\/p>\n<pre lang=\"sql\">SELECT a.[Id] FROM [tblXYZ] AS a\r\n  WHERE\r\n    (((a..[IdParent] IS NULL\r\n       AND a..[Id] NOT IN\r\n         (SELECT [IdXYZ]\r\n            FROM [tblSomething]\r\n              WHERE [IdParent] IS NOT NULL))))<\/pre>\n<p>Unschwer zu sehen werden hier mit dem Alias <strong><em>a<\/em><\/strong> zusammen irgendwie zwei Punkte verwendet. Bleibt die Frage warum in meiner Umgebung nun kein Fehler passiert und beim Kunden ein nun Syntax Fehler ausgel\u00f6st wird.<\/p>\n<p>Nach einigem Suchen fand ich die Ursache im Kompatibilit\u00e4tsgrad, den man im Managementstudio unter <em><strong>Datenbank -&gt; Datenbankname -&gt; Eigenschaften -&gt; Optionen <\/strong><\/em>je Datenbank separat einstellen kann. Dort sind folgende Einstellungen m\u00f6glich.<\/p>\n<p><em>SQL Server 2000 (80)<br \/>\nSQL Server 2005 (90)<br \/>\nSQL Server 2010 (100)<\/em><\/p>\n<p>In meiner Testumgebung verwende ich eine Datenbank, die seit den ersten Anf\u00e4ngen unserer Software immer weiter als Testumgebung mit vielen Testdaten dient. Sie wurde erstmals auf einem <em>SQL Server 2000<\/em> angelegt. Dann auf einen <em>2005er<\/em> und schlie\u00dflich auf einen <em>SQL Server 2008 R2<\/em> umgezogen. Netterweise &#8211; oder besser dummerweise &#8211; hat sich der <em>SQL Server <\/em>bei jeder Umstellung die ehemalige Kompatibilit\u00e4t gemerkt. Und man staunt nicht schlecht: Auf einem <em>SQL Server 2000<\/em> ist es kein Fehler zwischen Alias und Spaltennamen zwei Punkte zu schreiben. Bei einem <em>SQL Server 2005 <\/em>oder sp\u00e4ter ist das sehr wohl ein Syntaxfehler.<br \/>\nDer Fehler lag also doch bei uns &#8211;\u00a0was ja wirklich selten vorkommt \ud83d\ude00 &#8211; und wurde trotz genauer Tests nicht entdeckt.<\/p>\n<p>Man merke sich: <em>SQL Server<\/em> Syntax ist trotz gleicher <em>SQL Server<\/em> Version eben doch lange nicht das selbe.<br \/>\nWer also Software auf einem <em>SQL Server<\/em> testet sollte tunlichst darauf achten welchen Kompatibilit\u00e4tsgrad er benutzt \u2757<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nach einem der letzten Updates unserer Software meldete uns ein Kunde einen SQL Fehler, der bei einer bestimmten Operation auftrat.\u00a0Er setzt den MS-SQL Server 2008 ein. OK, meine Testumgebung hat drei Server von SQL 2000, \u00fcber 2005 bis 2008 R2. Keine der Testumgebungen brachte bei der entsprechenden gleichen Operation einen Fehler \ud83d\ude15 Gut oder besser &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/09\/22\/nette-falle-im-sql-server-kompatibilitaetsgrad\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eNette Falle im SQL-Server: Der Kompatibilit\u00e4tsgrad\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[11,3,15],"tags":[99,38,159,136,359],"class_list":["post-638","post","type-post","status-publish","format-standard","hentry","category-debugging","category-programmieren","category-sql","tag-bug","tag-debuggen","tag-ms-sql","tag-qualitaetssicherung","tag-sql"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=638"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":675,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/638\/revisions\/675"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}