Announcement

Collapse
No announcement yet.

Tabelle durch Subselect ermitteln:

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tabelle durch Subselect ermitteln:

    Ok, also folgende Situation:

    Ich möchte einen "dynamischen" Select generieren um folgendes zu ermöglichen:

    Je nach abgelegtem Tabellennamen in dem Feld "Tablename" der Quelltabelle Namedefinition sollen weitere Werte aus den sich daraus verzweigenden Tabellen ermittelt werden:

    1 Haupttabelle:

    In dieser Haupttabelle werden die zur Verfügung stehenden Verzweigungsmöglichkeiten aufgelistet. Gespeichert sind die Tabellennamen als varchar(x).

    Tabelle: Namedefinition
    ID __Tablename
    x123 Widerstand
    x252 Isolation
    x314 Spannung


    3 Untertabellen:

    Jede dieser Untertabellen kann Werte aufnehmen und soll durch den Select ansteuerbar sein um den gespeicherten wert mit dem aus der Haupttabelle zu vergleichen.

    Tabelle Widerstand:
    Value
    5

    Tabelle Isolation:
    Value
    2

    Tabelle Spannung:
    Value
    3


    Select Value from ( Select Tablename from Namedefinition where ID = x123)

    Ich möchte mich also je nach Auswahl auf eine andere untergeordnete Tabelle beziehen.

    In diesem Fall soll der Select den Value der Tabelle "Widerstand" (ID=x123) ausgeben.

    Diese Art von Subselect funktioniert nicht, warum und gibt es alternative Möglichkeiten um solche Verzweigungen zu ermöglichen?


    Liegt das Problem daran, dass der Subselect:
    Select Tablename from Namedefinition where ID = x123
    einen varchar(x) = 'Widerstand' zurückgibt und somit

    ein Select der Form Select Value from 'Widerstand'

    nicht funktioniert, da die betreffende Tabelle in Form eines Strings angegeben wird?

  • #2
    Das mit dem "dynamischen" select geht absolut in die richtige Richtung. Nur die Umsetzung sieht ein bisschen anders aus. Probiere doch mal ein

    declare @cmd varchar(400)
    select @cmd = 'Select Value from ' + Tablename from Namedefinition where ID = 'x123'
    exec (@cmd)

    Und zu dynamic SQL gibt es einen super Artikel:
    http://www.insidesql.org/beitraege/e...luch-und-segen

    bye,
    Helmut

    Comment


    • #3
      Okay dankeschön für die schnelle Antwort, ich sehe gerade aber selber dass ich meine Frage wohl etwas missverständlich ausgedrückt habe.

      Ein Teil ist allerdings schon beantwortet, und zwar wie ich auf dynamische Art und Weise den Inhalt einer Tabelle bekomme. Dies hatte ich bisher über den VB-Code gelöst.


      Ich möchte allerdings nicht nur den Inhalt einer Tabelle haben sondern:

      Den Inhalt aller Tabellen die in der Tabelle:Namedefinition aufgelistet sind.

      Als Ergebnis also folgendes:

      ID __Value
      x123 5
      x252 2
      x314 3




      declare @cmd varchar(400)
      select @cmd = 'Select Value from ' + Tablename from Namedefinition where ID >0
      exec (@cmd)

      funktioniert leider nicht, gibt es eine andere Möglichkeit?

      Comment


      • #4
        Dann also etwa so (Beispiel für den Query Analizer):
        Code:
        use tempdb
        go
        
        create table [Namedefinition] (
          id         varchar(6),
          tablename  varchar(40)
        )
        
        create table [Widerstand] ([value] int)
        create table [Isolation] ([value] int)
        create table [Spannung] ([value] int)
        
        insert into [Namedefinition] values('x123','Widerstand')
        insert into [Namedefinition] values('x252','Isolation')
        insert into [Namedefinition] values('x314','Spannung')
        
        insert into [Widerstand] values(5)
        insert into [Isolation] values(2)
        insert into [Spannung] values(3)
        
        declare @cmd varchar(4000)
        select @cmd = IsNull(@cmd + ' union ','') + 'select ''' + id + ''' as id, [value] from ' + tablename from [Namedefinition]
        exec(@cmd)
        
        drop table [Spannung]
        drop table [Isolation]
        drop table [Widerstand]
        drop table [Namedefinition]
        bye,
        Helmut

        Comment

        Working...
        X