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

dynamisches PIVOT

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von TwickelPurpel, 31 März 2016.

  1. TwickelPurpel

    TwickelPurpel Benutzer

    Moin zusammen,

    ich habe ein Problem bei der Erstellung eines dynamischen PIVOT.

    diese Variante läuft korrekt:

    SET @SQL=
    'SELECT VP,'
    + @Datum_Liste
    + ' into [MF_Workspace].[dbo].[VP_PIVOT] '
    + ' FROM '
    + ' (select VP, proz, Datum
    FROM [MF_Workspace].[dbo].[VP_Liste])
    AS SourceTable
    PIVOT (
    min(proz)
    FOR Datum IN (' + @Datum_Liste + ')) AS P
    ORDER BY cast(VP as numeric)'

    ersetze ich nun den Teil:
    FROM [MF_Workspace].[dbo].[VP_Liste]

    erhalte ich eine Fehlermeldung:

    SET @SQL=
    'SELECT VP,'
    + @Datum_Liste
    + ' into [MF_Workspace].[dbo].[VP_PIVOT] '
    + ' FROM '
    + ' (select VP, proz, Datum
    FROM ' + @tmp_Liste + ')
    AS SourceTable
    PIVOT (
    min(proz)
    FOR Datum IN (' + @Datum_Liste + ')) AS P
    ORDER BY cast(VP as numeric)'



    Must declare the scalar variable "@tmp_Liste".

    Ich vermute, dass ich die @tmp_Liste nicht korrekt mit den Hochkommas auskoppel, aber alle mir bekannten Varianten führen zu keinem Ergebnis. Vielleicht noch ein Hinweis: Die funktionierende Variante habe ich nur erstellt, weil ich mit der anderen nicht weitergekommen bin. Die Tab [MF_Workspace].[dbo].[VP_Liste] wird aus der @tmp_Liste erzeugt, will sagen die Variable ist deklariert.

    select *
    into [MF_Workspace].[dbo].[VP_Liste]
    from @tmp_Liste

    Bin für jede Anregung dankbar...
     

    Anhänge:

  2. ukulele

    ukulele Datenbank-Guru

    Du schreibst zwar, das @tmp_Liste deklariert wurde im Text weder in deinem Code noch in den ganzen Bildern ist das irgendwo zu sehen. An dem gezeigten gibts keine erkennbare Ursache aber die Fehlermeldung läßt vermuten das die Variable einfach nicht deklariert wurde. Vieleicht ein Tippfehler? Oder steht das DECLARE irgendwo in einem If oder an der falschen Stelle?
     
  3. TwickelPurpel

    TwickelPurpel Benutzer

    Die Deklaration ist am Anfang der Abfrage erstellt.

    declare @tmp_Liste table
    (ID int identity(1,1) primary key not null,
    VP nvarchar(10),
    proz nvarchar(40),
    Datum nvarchar(8))

    ...aber deswegen habe ich ja auch beschrieben, dass die "Die Tab [MF_Workspace].[dbo].[VP_Liste] wird aus der @tmp_Liste erzeugt, will sagen die Variable ist deklariert." Wäre die Variable nicht deklariert, würde auch wie beschrieben

    select *
    into [MF_Workspace].[dbo].[VP_Liste]
    from @tmp_Liste

    auf einen Fehler laufen.
     
  4. ukulele

    ukulele Datenbank-Guru

    Ah okay ich glaube zu verstehen.

    Du hast eine als Tabelle deklarierte Variable, das funktioniert offensichtlich in deinem FROM @tmp_Liste aus Post #3. In deinem Eingangsstatement verwendest du aber
    Code:
    ' (select VP, proz, Datum FROM ' + @tmp_Liste + ')'
    hier erwartet SQL natürlich einen reinen String als Tabellennamen und kann @tmp_Liste als eigenständige Tabelle nicht an einen String anhängen.
    Code:
    ' (select VP, proz, Datum FROM @tmp_Liste )'
    könnte funktionieren, wenn beim ausführen von @SQL auch @tmp_Liste bekannt ist.
     
  5. TwickelPurpel

    TwickelPurpel Benutzer

    nee, wenn in einen select ein Variable enthalten ist, muss nach nach meinem Kenntnisstand das select in eine weitere Variable wie im Beispiel "Set @SQL" setzen und diese Variable dann mit "exec @SQL" ausführen. Analog ist es ja mit der Variablen @Datum_Liste. @tmp_Liste ist definitiv bekannt.
     
  6. ukulele

    ukulele Datenbank-Guru

    Wie kann dann
    Code:
    select *
    into [MF_Workspace].[dbo].[VP_Liste]
    from @tmp_Liste
    funktionieren? Ist auch ein Select auf @tmp_Liste
    Was hat denn @Datum_Liste für ein Format, auch TABLE?
     
  7. TwickelPurpel

    TwickelPurpel Benutzer

    da hast du recht. Ich kann nicht sagen, ob der Umweg über ein SET @SQL und exec nur für das Pivot erforderlich ist oder eben auch für eine etwas ausgeprägtere select-Anweisung. Fakt ist, es funktioniert auch mit deinem Vorschlag nicht, eben auch nochmal getestet.

    declare @Datum_Liste as nvarchar(4000)
     
  8. ukulele

    ukulele Datenbank-Guru

    Hm okay dann vermute ich mal das wenn EXEC() @SQL ausführt in diesem Kontext @tmp_Liste nicht bekannt ist (die Fehlermeldung das die Variable nicht deklariert ist ist also vermutlich im Rahmen von EXEC() aufgetreten).

    Eigentlich willst du ja auch nur den Tabellennamen [MF_Workspace].[dbo].[VP_Liste] einsetzen, in der jetzigen Variable ist ja viel mehr enthalten. Das sinnigste wäre eine neue Variable als VARCHAR zu vergeben und mit [MF_Workspace].[dbo].[VP_Liste] zu belegen, oder spricht da was gegen?

    Code:
    DECLARE @tabellenname VARCHAR(100)
    SET @tabellenname = '[MF_Workspace].[dbo].[VP_Liste]'
    
    [...]
    ' (select VP, proz, Datum FROM ' + @tabellenname + ')'
    [...]
    
     
  9. TwickelPurpel

    TwickelPurpel Benutzer

    funktioniert, aber :)

    ist leider nicht die Lösung ohne eine "physische" Tabelle.
    Demnach liegt das Problem dann ja wohl nicht in der Variablen, sondern in der @tmp_Table selbst.

    Aber vielen Dank schon mal für das Interesse an meinem Problem und die Idee, versuche nun mal raus zu finden wie ich meine angestrebte Lösung umsetzten kann. Problem ist nun aber definitiv eingegrenzt, danke.
     
  10. ukulele

    ukulele Datenbank-Guru

    Ich hab noch nie was mit Tabellen innerhalb von Variablen gemacht da gibts vieleicht auch noch Einschränkungen. Vieleicht macht es mehr Sinn eine temporäre Tabelle anzulegen:
    Temporäre Tabellen vs. Tabellenvariablen › db-Berater

    PS: Hier steht es auch:
    "Während temporäre Tabellen während einer ganzen Session gültig sind, beschränkt sich die Gültigkeit von Tabellenvariablen immer auf den BATCH!"

    Daran scheitert mein erster Lösungsansatz auf jeden Fall.
     
  11. Tommi

    Tommi Datenbank-Guru

    Hallo Twickel,

    du versuchst ein deklariertes Tabellen-Objekt mit einem String-Objekt zu verknüpfen.
    Das funktioniert nicht, da dies zwei verschiedene Datentypen sind.

    Du musst deine Tabellendeklaration innerhalb des SQL-Strings vornehmen.
    Dann musst du aber auch die Daten, die in dem deklarierten Tabellenobjekt verwaltet werden sollen, innerhalb des SQL-Strings in diese Tabelle eintragen (mittels INSERT).

    Da das Ausführen eines SQL-Strings mittels EXECUTE aber so oder so nur in einer Stored Procedure oder über eine Ausführung innerhalb des Management-Studio funktioniert, macht die Lösung mittels einer temporären Tabelle, die ukulele bereits vorgeschlagen hat, mehr Sinn.

    Wenn man eine Session-übergreifende temporäre Tabelle nutzt (##Tabelle) kann man diese dann auch in einem String mittels EXECUTE ansprechen.
    Die über die Variable @Datum_Liste vorgesehene Dynamik wirst du ja weiterhin benötigen.

    Viele Grüße,
    Tommi
     
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