Tabellenname eines Feldes ermitteln

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabellenname eines Feldes ermitteln

    Hi!

    Ich habe da ein Problem mit MSSQL in Verbindung mit PHP und ADODB.

    TECHNISCHE DATEN:
    ~~~~~~~~~~~~~~~~~
    Datenbank: Microsoft SQL Server (MSSQL 7.0)
    Interpreter: PHP 4.2x
    PHP Modul: ADODB 4.52


    WORUM ES GEHT:
    ~~~~~~~~~~~~~~
    Es geht um ein php Tool, dass auf Basis von den aus einer SQL-Abfrage gewonnenen Informationen, eine Übersicht und ein
    Eingabeformular erstellt.

    In der Übersicht sollen alle Daten, die aus der SQL-Abfrage resultieren angezeigt werden.

    Das Eingabeformular soll aber nur für eine der Tabellen, die in dieser SQL-Abfrage vorkommen,
    angelegt werden, so dass man diese bestimmte Tabelle mit dem Formular füllen kann.


    MEIN PROBLEM:
    ~~~~~~~~~~~~~
    Ich erhalte alle möglichen Informationen über die Datenbank, die Tabellen und die Felder.
    Auch das ermitteln der in der SQL-Abfrage verwendeten Felder ist kein Problem.
    Aber mir bleibt zu jedem Feld die Vater-Tabelle verborgen.
    Keine Ahnung zu welcher Tabelle ein Feld gehört ?!?

    Vor kurzem habe ich gelesen, dass in den MSSQL Datenbanken Version 7 und 2000 der PHP Befehl "mssql_fetch_field"
    das Element "column_source" nicht mehr mit dem Tabellennamen bestückt, sondern noch einmal den Feldnamen hergibt.
    Ebenso liefert auch ADODB's FetchField($field) zweimal den Feldnamen.

    Zweimal den Feldnamen auszugeben macht meines erachtens nicht wirklich Sinn .. handelt es sich da um einen Bug?

    Da ich aber zu jedem ermittelten Feld zwingend den Tabellennamen benötige bin ich für jegliche Hilfe dankbar!
    Was kann ich tun?
    Gibts da draußen jemand der sich etwas besser mit MSSQL auskennt als ich?


    MÖGLICHE ANSÄTZE:
    ~~~~~~~~~~~~~~~~~
    Folgende Lösungsansätze hab ich bislang in Erwägung gezogen:

    1. Zerlegen der SQL-Abfrage und herausfiltern der Tabellennamen und der Feldnamen.
    Bedingung: Vor jedem Feldnamen muss der Tabellenname stehen.
    Nachteile: Die SQL-Abfrage muss zwingend nach einem vordefiniertem Chema aufgebaut sein, so das der Parser ihn verstehen kann.

    2. Nachträgliche Ermittlung des Tabellennamens mittels einer weiteren SQL-Abfrage.
    Bedingung: Es muss irgendwie eine Möglichkeit bestehen, mittels des Feldnamens die passende Tabelle zu finden.
    Nachteile: Nicht eindeutige Feldbezeichner können nicht eindeutig einer Tabelle zugeordnet werden.
    (z.B. ein Feld mit der Bezeichnung "ID" könnte in verschiedenen Tabellen vorkommen)

    3. Mit der Feld Objekt ID den Tabellennamen ermitteln:
    Bedingung: Man braucht diese Feld Objekt ID.

    Beispiel SQL-Abfrage zum ermitteln des Tabellennamens mittels der Feld Objekt ID:

    SELECT dbo.syscolumns.name, dbo.syscolumns.id, dbo.syscolumns.xtype, dbo.syscolumns.typestat, dbo.sysobjects.name
    FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id WHERE (dbo.syscolumns.id = ".$object_id.")

    WIE komme ich an diese Feld Objekt ID heran?

    IRGENDWELCHE IDEEN ?
    ~~~~~~~~~~~~~~~~~~~~
    So langsam bin ich mit meinem Latein am Ende.
    Wenn ihr noch irgendwelche Ideen habt dann immer her damit .. wäre doch gelacht wenn mir diese Tabellennamen auf ewig verborgen blieben!

    Schonmal danke für eure Mühe
    - Frank -

    -------------------------------
    fjacob at SolTeCon.com
    www dot SolTeCon dot com

  • #2
    lange Rede kurze Sinn Du willst also anhand des Spaltennamen den Tabellennamen heraus finden? Wenn ja:

    SELECT a.[name] tblname FROM sysobjects a inner join syscolumns b on a.id=b.id where a.xtype='U' and b.[name]='dein_spalten_name'

    Kommentar


    • #3
      lange Rede kurze Sinn Du willst also anhand des Spaltennamen den Tabellennamen heraus finden? Wenn ja:

      SELECT a.[name] tblname FROM sysobjects a inner join syscolumns b on a.id=b.id where a.xtype='U' and b.[name]='dein_spalten_name'

      Ist das denn auch eindeutig?
      (siehe MÖGLICHE ANSÄTZE -> Punkt 2 -> Nachteile)

      Wenn ja, warum?

      Kommentar


      • #4
        Original geschrieben von Frajac
        Ist das denn auch eindeutig?
        (siehe MÖGLICHE ANSÄTZE -> Punkt 2 -> Nachteile)

        Wenn ja, warum?
        nein du bekommst eine Liste von tblname, welche die Spalte '...' enthält.

        Aber drehen wir das Spiel mal um. du sagtest:
        Ich erhalte alle möglichen Informationen über die Datenbank, die Tabellen und die Felder.
        Auch das ermitteln der in der SQL-Abfrage verwendeten Felder ist kein Problem.
        Aber mir bleibt zu jedem Feld die Vater-Tabelle verborgen.
        Keine Ahnung zu welcher Tabelle ein Feld gehört ?!?
        falscher Ansatz sage ich. Denn dein Ziel ist:
        Es geht um ein php Tool, dass auf Basis von den aus einer SQL-Abfrage gewonnenen Informationen, eine Übersicht und ein
        Eingabeformular erstellt.

        In der Übersicht sollen alle Daten, die aus der SQL-Abfrage resultieren angezeigt werden.

        Das Eingabeformular soll aber nur für eine der Tabellen, die in dieser SQL-Abfrage vorkommen,
        angelegt werden, so dass man diese bestimmte Tabelle mit dem Formular füllen kann.
        also wie geht man vor? Ich würde so vorgehen:
        - Server aufsuchen und eine Liste der angelegt DB anzeigen -> DB wird ausgewählt
        - Liste alle Usertabelle anzeigen -> eine Tabelle zur Bearbeitung wird ausgewählt
        - Liste alle Spalten und deren Inhalt anzeigen. Nun kann man:
        + Spaltennamen ändern
        + Spalte hinzufügen
        + Spalte löschen
        + neue DS anlegen
        + bestehende bearbeiten
        + bestehende löschen
        ---> anhand der bisherige Daten sehe ich keinerlei Schwierigkeiten wegen Zuordnung: Spalte->Tabelle->DB

        Diese strukturierte Vorgehensweise findest du bei (fast) allen DB-Management-Tools.
        Zuletzt geändert von asp2php; 22.09.2004, 12:48.

        Kommentar


        • #5
          also wie geht man vor? Ich würde so vorgehen:
          - Server aufsuchen und eine Liste der angelegt DB anzeigen -> DB wird ausgewählt
          - Liste alle Usertabelle anzeigen -> eine Tabelle zur Bearbeitung wird ausgewählt
          - Liste alle Spalten und deren Inhalt anzeigen. Nun kann man:
          + Spaltennamen ändern
          + Spalte hinzufügen
          + Spalte löschen
          + neue DS anlegen
          + bestehende bearbeiten
          + bestehende löschen
          ---> anhand der bisherige Daten sehe ich keinerlei Schwierigkeiten wegen Zuordnung: Spalte->Tabelle->DB

          Diese strukturierte Vorgehensweise findest du bei (fast) allen DB-Management-Tools.
          Diese vorgehensweise mag ja auch Sinn machen wenn man sich mit der Auswahl einzelner Tabellen begnügt, aber für die Übersicht, die sich aus einer beliebigen SQL-Anweisung aufbaut, reicht es nicht dem Anwender eine Liste mit Tabellen zu presentieren aus dener er sich eine oder mehrere aussucht. Im schlimmsten Falle besteht eine solche Anweisung aus dem Kreutzprodukt vieler verschiedener Tabellen die alle eine Feld mit der Bezeichnung "ID" haben. Wie filtere oder sortiere ich dann nach diesem Feld?

          Ich brauche den Tabellennamen eines Feldes aus verschiedenen Gründen:

          1: Um genauere Informationen über ein Feld zu erhalten
          2: Um meine HTML-Felder eindeutig benennen zu können ("TABELLENNAME.FELDNAME").
          3: Wenn ich in meiner Übersicht filtern oder sortieren möchte, brauche ich die eindeutigen Tabelle-Feldname Kombinationen weil z.B. ein Feld mit der Bezeichnung "ID" mehrfach vorkommen kann. In SQL würde man dann einfach schreiben "ORDER BY tabelle1.id". Bei den dynamischen Erzeugung einer solchen ORDER BY-Anweisung ist das nicht so einfach ohne Tabellenname zu lösen.

          Die Auswahl einer Tabelle aus einer Liste aller verfügbaren Tabellen ist wohl die Lösung für das Eingabeformular, aber die Übersicht lässt sich damit wohl nicht verwirklichen.

          Kommentar


          • #6
            wenn du zwei tabellen hast, die die spalte id haben, dann geht es ja nicht so:
            Code:
            SELECT id, id
            FROM a, b
            sondern so:
            Code:
            SELECT a.id, b.id
            FROM a, b
            und da kannst du doch mit einem tollen regulären ausdruck (bei den tutorials ist das ganz gut erklärt, auf http://pcre.nophia.de kannst du testen) rausfindne, was für ein tabellenname vor der spaltenangabe steht; wenn keiner da steht, dann ist der spaltenname für die verwendeten tabellen eindeutig
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              wenn ich richtig verstanden habe, willst du aus einer beliebigen "select ...", die Möglichkeit einer Editierung aller darin vorkommenen Spalten bzw. Tabellen anbieten?

              Wenn ja, dann wird kompliziert, denn MS-SQL ist nicht so einfach wie MySQL. Die Abfrage kann vielfach verschachtelt sein. Es können mehrere Abfragen semikolon getrennt in einem Abfragestring enthalten sein. Tabellen-/Spaltenalias kommen auch noch hinzu ... und und und...

              Doch du kann keine Abfrage ohne Angaben von Tabellennamen absetzen (SP, VIEW und USERFUNCTION ausgenommen). Also du musst nur die Beziehung zwischen angebenen Spalten und Tabellen feststellen. Hier ist RegEx gefragt, aber ... das wird sehr kompliziert. Ob es sich lohnt?

              Kommentar

              Lädt...
              X