none
Spaltennamen zusammenseten ? RRS feed

  • Frage

  • Hallo zusammen

    ist Es möglich in einer Abfrage den Spaltenname in einer Select-Anweisung dynamisch zusammen zu setzen? (ohne Case)

    Beispiel: Tabelle Test mit Spalten

    Artikel, Attr1, Attr2, Attr3

    1002,   XYZ,  NULL, NULL

    2001,   NULL, ABC, NULL

    3004,   NULL, NULL, RST

    Nun möchte ich Abhängig von der ersten Ziffer der Artikelnummer die Spalten Attr1 / 2 oder 3 abfragen. ungefähr so:

    select Test.'Attr' & Left(Test.Artikel , 1) as Result

    From Database

    Where Blabla 

    Weiss jemand für sowas ´ne Lösung? oder gibt es da eine Funktion?

    Ist so etwas Alternativ im Reporting-Tool möglich?

    DANKE


    SisualStudio express 2012 C#

    Mittwoch, 13. November 2013 10:11

Antworten

  • Du kanst drei separate Selects bauen, die jeweils nur die Zeilen liefern, deren Artikelnummer mit 1, 2 und 3 beginnen. Dazu das Attr1, Attr2 bzw. Attr3 pcken und danch die drei SELECT-Anweisungen per UNION miteinander verbinden.

    In etwa so: (nicht ausprobiert, aus der Hüfte geschossen)

    SELECT Artikel, Attr1 AS Attr FROM Tabelle WHERE LEFT(Artikel, 1) = '1'
    UNION
    SELECT Artikel, Attr2 AS Attr FROM Tabelle WHERE LEFT(Artikel, 1) = '2'
    UNION
    SELECT Artikel, Attr3 AS Attr FROM Tabelle WHERE LEFT(Artikel, 1) = '3'
    

    Damit würdest du zumindest dynamisches SQL umgehen.


    Andreas Richter
    Softwareentwickler
    http://www.anrichter.net

    • Als Antwort markiert kudlmudl Donnerstag, 14. November 2013 05:55
    Mittwoch, 13. November 2013 14:28

Alle Antworten

  • Hallo kudlmudl,

    ja dies ist möglich. Das Zauberwort hiefür lautet dynamisches SQL. Im einfachsten Fall würde dies wie folgt aussehen:

    DECLARE @colname varchar(10)
    SELECT @colname = LEFT(Artikel,1) FROM Tabelle
    SELECT @colname = 'Attr'+@colname
    EXEC ('SELECT '+@colname+' FROM Tabelle')
    

    Auf alle Fälle solltest Du dir aber folgenden Beitrag mal ansehen:
    Dynamisches SQL: Fluch und Segen


    Gruß Falk

    Blog Falk Krahl

    Mittwoch, 13. November 2013 11:04
  • Danke Falk für Deine schnelle Antwort.

    Welche Vorausetzung muss für Dyn. SQL erfüllt sein, weil ich nur eine Fehlermeldung "Konstrukt oder die Anweisung "Deklarieren" wird nicht unterstützt." vom Report-Building bekomme.


    SisualStudio express 2012 C#

    Mittwoch, 13. November 2013 11:48
  • Du kanst drei separate Selects bauen, die jeweils nur die Zeilen liefern, deren Artikelnummer mit 1, 2 und 3 beginnen. Dazu das Attr1, Attr2 bzw. Attr3 pcken und danch die drei SELECT-Anweisungen per UNION miteinander verbinden.

    In etwa so: (nicht ausprobiert, aus der Hüfte geschossen)

    SELECT Artikel, Attr1 AS Attr FROM Tabelle WHERE LEFT(Artikel, 1) = '1'
    UNION
    SELECT Artikel, Attr2 AS Attr FROM Tabelle WHERE LEFT(Artikel, 1) = '2'
    UNION
    SELECT Artikel, Attr3 AS Attr FROM Tabelle WHERE LEFT(Artikel, 1) = '3'
    

    Damit würdest du zumindest dynamisches SQL umgehen.


    Andreas Richter
    Softwareentwickler
    http://www.anrichter.net

    • Als Antwort markiert kudlmudl Donnerstag, 14. November 2013 05:55
    Mittwoch, 13. November 2013 14:28
  • Danke Andreas

    das hat zwar nicht ganz mein eigendlich angestrebtes Ergebnis gebracht, jedoch bringt es mich, zumindest über Umwege, zum Ziel.

    Das mit Dynamic SQL ist auch ein guter Ansatz, jedoch wird es scheinbar von unserem VisualStudio(ReportService) nicht unterstützt.

    Danke für die Antworten  


    SisualStudio express 2012 C#

    Donnerstag, 14. November 2013 05:55