none
String addieren Operator, in Oracle || in MSSQL +, gibt es ein SQL Script für beides? RRS feed

  • Frage

  • Hallo Forum,

    folgendes SQL Statment funktioniert gegen MS SQL:

    SELECT SPALTE1 + SPALTE2 AS LANGERTEXT FROM TABELL1

    in Oracle musste ich das jetz anpassen:

    SELECT SPALTE1 || SPALTE2 AS LANGERTEXT FROM TABELL1

    Beide SQL Statements scheinen nur auf der jeweiligen Datenbank zu funktionieren.

    Gibt es ein allgemeingültiges Script mit dem ich zwei Strings miteinander verketten kann?

    Gruß und TIA

    Michael

    Mittwoch, 20. Juli 2011 11:37

Antworten

  • Hallo Michael,

    Nein, das weicht ab.

    Und einer der (vielen) Gründe, warum ich hier schon eine Trennung empfohlen hatte:
    2.) Sinnvoller wäre die Datenbanksysteme deutlicher zu trennen, so dass Du nicht genötigt bist,
    den kleinsten gemeinsamen Nenner beim SQL zu finden.

    Gruß Elmar

    P.S.: mit Denali gibt es dann Concat (kennt m. W. auch Oracle) - das hilft aber heute nicht.

    Mittwoch, 20. Juli 2011 12:05
    Beantworter

Alle Antworten

  • Hallo Michael,

    Nein, das weicht ab.

    Und einer der (vielen) Gründe, warum ich hier schon eine Trennung empfohlen hatte:
    2.) Sinnvoller wäre die Datenbanksysteme deutlicher zu trennen, so dass Du nicht genötigt bist,
    den kleinsten gemeinsamen Nenner beim SQL zu finden.

    Gruß Elmar

    P.S.: mit Denali gibt es dann Concat (kennt m. W. auch Oracle) - das hilft aber heute nicht.

    Mittwoch, 20. Juli 2011 12:05
    Beantworter
  • Hallo Elmar,

     

    danke für die Antwort,

    ich möchte halt möglicht wenig Datenbank abhängige Ausführungspfade haben.

    Aber hier muss ich wohl tatsächlich abfragen, welche Datenbank dahinter liegt,

    und die unterschiedlichen Strings absetzen.

     

    Seltsam das so etwas simples schon unterschiedlich in Oracle und SQL gehandhabt wird.

     

    Gruß

    Michael

    Mittwoch, 20. Juli 2011 12:41
  • Hallo Michael,

    auch wenn es im ersten Moment paradox erscheinen mag:

    "Möglichst wenig Datenbank abhängige Ausführungspfade" erhältst Du dann,
    wenn Du die Datenbanken in eigene Datenklassen trennst.

    Mit etwas Vererbung kann man die Teile, die wirklich gleich sind, in eine Basisklasse packen.

    Dazu schreibst Du ein Testmodul (aka Unit Test), der die erwartenden Ergebnisse
    gegen die jeweiligen Provider prüft.

    Kommt eine Datenbank hinzu, schreibt man einen weiteren Provider ...

    Alles andere führt über kurz oder lang zu einem Anwachsen der Komplexität (Ausführungspfade),
    wenn da immer wieder steht if (Oracle) oder if ((SqlServer || Sybase) && !Oracle)

    Gruß Elmar

    Mittwoch, 20. Juli 2011 14:06
    Beantworter
  • Hallo Elmar,

     

    leider habe ich hier die Krücke "vbscript" mit der die sql strings abgesetzt werden.

    Aber trotzdem danke.

     

    Gruß

    Michael

    Mittwoch, 20. Juli 2011 14:27
  • Hallo Michael,

    wenn Du meinst, damit kämst Du davon ;-)

    Da kann man die SQL Anweisungen in eine Xml- oder Textdatei verlagern,
    lässt ggf. einen RegEx für Ersetzungen drüberlaufen,
    splittet sie in WSF-Dateien damit man die Übersicht nicht verliert
    ...

    oder macht Nägel mit Köpfen und entwirft COM-Klassen mit .NET

    (Wenn Du jetzt mit COBOL kommst, das hatte ich auch schon mal ;-)

    Gruß Elmar

    Mittwoch, 20. Juli 2011 15:43
    Beantworter
  • Hallo Elmar, ok du hast mich erwischt, ich bin ein fauler Hund und belass es dann beim Zweizeiler im vbscript ;)

      if(constring = "Provider=MSDASQL.1;") then
       SQLString = "SELECT VORGANG + '|' + TYP + '|' + GRUND AS COMBO1 FROM DOK_TYPEN ORDER BY VORGANG,TYP,GRUND"
      else
       SQLString = "SELECT VORGANG || '|' || TYP || '|' || GRUND AS COMBO1 FROM DOK_TYPEN ORDER BY VORGANG,TYP,GRUND"
      end if

     

    Der eigentliche Grund ist eh nur das ich bei mir lokal das in einer MSSQL Datenbank habe,

    und beim Kunden ist es eine Oracel Datenbank. Die ich beide über einen identischen ODBC DSN anspreche

     

    Gruß Michael

    Mittwoch, 20. Juli 2011 16:07
  • Hallo Michael,

    In VBScript kann man auch Ersetzungen durchführen :)

    Dim SqlString
      SqlString = "SELECT VORGANG {+} '|' {+} TYP {+} '|' {+} GRUND ..."
      SqlString = ReplaceSqlPlaceholder( SqlString, DbType.SqlServer )
    
    Function ReplaceSqlPlaceholder( ByVal SqlCommand, ByVal DbType )
    
    Dim Result
      Result = SqlCommand
    
      Select Case DbType
        Case SqlServer
          Result = Replace( Result, "{+}", "+" )
          ...
        Case Oracle
          Result = Replace( Result, "{+}", "||" )
          ...
      End Select
    
      ReplaceSqlPlaceholder = Result
    
    End Function
    
    


    Soll in etwa heißen, die Sachen wie || vs. +, GETDATE(), ... werden einfach als Platzhalter geschrieben, {+}, {Date}, ... und dann über eine Funktion ersetzt.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Mittwoch, 20. Juli 2011 17:36
    Moderator
  • Hallo Michael,

    das mit dem "faulen Hund" hatte ich nicht mal gedacht.
    Und Abkürzungen gehen wir alle mal (oder glauben es zumindest).

    Wenn das Ganze mit steigendem Umfang später stressiger und nerviger wird,
    so erinnern sich Deine kleinen grauen Zellen vielleicht an diese Aussagen
    und werden dann kreativ ;-)

    Gruß Elmar

    Mittwoch, 20. Juli 2011 21:09
    Beantworter
  • Hallo Elmar Hallo Stefan,

     

    danke nochmal für die Hinweise,

    da es nur eine einmalige Sache für einen Kunden ist, die ich

    nicht irgendwo wiedeverwenden kann, belass ich es jetzt so.

     

    Sollte sich herauskristallisieren das ich es nocheinmal brauche,

    werde ich mich an deine Worte erinnern ;)

     

    Gruß

    Michael


    Donnerstag, 21. Juli 2011 08:47