Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Warum kann meine Select @variable abrufen?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von IchHH, 29 Mai 2017.

  1. IchHH

    IchHH Datenbank-Guru

    Hallo, weiß jemand von euch warum man im Select keine Spalte über eine Variable aufrufen kann?

    Ich stellte mir das wie folgt vor:

    Code:
    DECLARE    @kopf varchar(100)
    SET @kopf = (Select Case When DateName(dw,GetDate()) = 'Montag'
                    Then 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day,0,GetDate()),104)
                    Else 'Saldo vom ' + Convert([nvarchar](10),DateAdd(day,0,GetDate()),104) End)
    SELECT     [DOM1\20-DIAS].S_92620.*, @kopf
    FROM         [DOM1\20-DIAS].tmp INNER JOIN
                          [DOM1\20-DIAS].S_92620 ON [DOM1\20-DIAS].tmp.Kontenart = [DOM1\20-DIAS].S_92620.Kontenart
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Vermutlich weil auch in M$SQL der Planner erst einmal einen Abfrageplan erstellt, den er dann ausführt. Dazu muß er bei der Erstellung des Planes bereits alle nötigen Informationen haben, insbesondere auch, welche Spalten abzufragen sind (auch wenn in Deinem IF ... THEN ... ELSE ... Then und Else gleich sind, wie mir scheint.
     
  3. IchHH

    IchHH Datenbank-Guru

    Das war keine Lösung für mein Problem ;)

    Ich habe versucht mittels
    Select COLUMN_NAME FROMINFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME ='S_92620'
    die Spalten zu ermitteln -> läuft. Sobald ich das aber in einer Variablen tue wie zum Beispiel

    Declare @test varchar (5000)
    Set @test = (Select COLUMN_NAME FROMINFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME ='S_92620') oder
    Set @test = 'Select COLUMN_NAME FROMINFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME ='S_92620''

    funktioniert es nicht mehr diese in einer Select Abfrage einzubauen.

    Das die If THEN ELSE abfrage gleich aussieht ist nur zu Testzwecken, nachher würde ich minus x Tage in Then und minus XX Tage in Else verbauen.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Wenn Du ein SQL so zusammenstellst, dann ist das ein dynamisches SQL und muß via EXECUTE ausgeführt werden. Dieses muß dann vollständig aufgelöst sein, damit die Syntax geprüft und der Planner einen Plan erstellen kann. Das ist sehr sicher auch bei M$SQL so, auch wenn ich das nicht nutze.
     
  5. ukulele

    ukulele Datenbank-Guru

    Du hast ja auch nach dem "Warum" gefragt und nicht nach einer "Problemlösung". Warum das technisch so ist kann ich dir auch nicht erklären, aktschmer hat das ja schon versucht, genauer weiß ich das auch nicht. Fakt ist das kein SQL Server Variablen, Unterabfragen oder Funktionen anstelle von expliziten Tabellen- oder Spaltennamen oder sogar anstelle von Schlüsselwörtern annimmt.
     
  6. IchHH

    IchHH Datenbank-Guru

    Leider wurde die Lösung genannt und nicht aufgezeigt, aber es war das erste Mal das ich verstanden haben was gemeint war und ich auch gelöst bekommen haben.

    Wenn du nun noch eine Idee hast wie ich den letzten und vorletzten Spaltennamen ermitteln kann, bin ich ein großen Schritt vorangekommen heute.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Mal so als Zwischenbemerkung: mir scheint, Du machst grundlegende Fehler im Umgang mit einer relationalen Datenbank. Möglicherweise suchst Du eher eine Tabellenkalkulation.
     
    ukulele gefällt das.
  8. IchHH

    IchHH Datenbank-Guru

    Das verstehe ich nicht. Es ist schon von mir so gedacht, dass ich die SQL Datenbank für eine Tabellenkalkulation nutze, auch wenn diese dafür nicht vorgesehen ist.
     
  9. IchHH

    IchHH Datenbank-Guru

    Hast du aber eine Lösung für mein Problem? Über "Where" kann ich nicht gehen, da ich auch gleich zwei Datenbanken miteinander verknüpft habe.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Ja. Wirf Deinen Ansatz komplett weg.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden