dynamisches PIVOT

TwickelPurpel

Benutzer
Beiträge
5
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

  • upload_2016-3-31_8-40-28.png
    upload_2016-3-31_8-40-28.png
    3,2 KB · Aufrufe: 6
  • upload_2016-3-31_8-41-16.png
    upload_2016-3-31_8-41-16.png
    13,4 KB · Aufrufe: 8
  • upload_2016-3-31_8-42-21.png
    upload_2016-3-31_8-42-21.png
    13,3 KB · Aufrufe: 4
  • upload_2016-3-31_8-43-23.png
    upload_2016-3-31_8-43-23.png
    12,9 KB · Aufrufe: 4
  • upload_2016-3-31_8-44-22.png
    upload_2016-3-31_8-44-22.png
    13 KB · Aufrufe: 7
  • upload_2016-3-31_9-17-17.png
    upload_2016-3-31_9-17-17.png
    3,3 KB · Aufrufe: 6
  • upload_2016-3-31_9-17-53.png
    upload_2016-3-31_9-17-53.png
    3 KB · Aufrufe: 4
Werbung:
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?
 
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.
 
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.
 
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.
 
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
Wie kann dann
Code:
select *
into [MF_Workspace].[dbo].[VP_Liste]
from @tmp_Liste
funktionieren? Ist auch ein Select auf @tmp_Liste
Analog ist es ja mit der Variablen @Datum_Liste.
Was hat denn @Datum_Liste für ein Format, auch TABLE?
 
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)
 
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 + ')'
[...]
 
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.
 
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.
 
Werbung:
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
 
Zurück
Oben