2016-06-30 20 views
1

Ich frage mich nur, ob es eine Möglichkeit gibt, eine Pivot-Abfrage, mit dynamischen Spaltennamen zu tun, ohne zu dynamischem SQL greifen (declare @sql_text varchar(max) = 'select ...' etc.)Dynamische Pivot-Spalten ohne dynamische SQL-Anweisung?

dynamischer SQL reibt mir nur in die falsche Richtung.

Im Grunde habe ich eine Abfrage wie folgt (und ich hatte alles Tabelle/Spaltennamen ändern IP zu schützen, damit, wenn es Störung eine Syntax ist irgendwo keine Sorge darüber)

declare @sec_class_ids table (CLASS_ID varchar(50)); 

insert @sec_class_ids (CLASS_ID) values 
('987987987'), -- END USER - SAVE AND EXPORT [987987987] 
('654654654'), -- END USER - SAVE [654654654] 
('321321321') -- 'END USER - SPECIAL - SAVE AND EXPORT [321321321]' 


select * from (
    select 
     class.NAME as sec_class_name, 
     sec_attr.NAME as sec_attr, 
     'YES' as granted 
    from sec_class class 
    inner join class_sec_attr 
     on class.class_id = class_sec_attr.class_id 
    inner join sec_attr 
     on sec_attr.sec_attr_id = class_sec_attr.sec_attr_id 
    inner join @sec_class_ids input 
     on input.class_id = class.class_id 
    ) as sec_attrs 
pivot (
    max(sec_attrs.granted) 
    --for sec_attrs.sec_class_id in (@sec_class_ids) 
    for sec_points.sec_class_name in ([END USER - SAVE AND EXPORT],[END USER - SAVE],[END USER - SPECIAL - SAVE AND EXPORT]) 
) as sec_class_comparison 
; 

Ich würde gerne die Tabelle var(im Kommentar angezeigt) anstatt die Spalten für jede Abfrage manuell festlegen können. Ich bin mir bewusst, dass dies mit Dynamic SQL möglich und recht einfach ist, aber ich möchte das vermeiden, wenn es irgendwie möglich ist.

+0

Haben Sie versucht, eine SELECT-Unterabfrage ('in (SELECT DesiredColumn FROM @TableName)') in der kommentierten Zeile statt nur 'in (@TableName)'? –

+0

@TabAlleman PIVOT erlaubt das nicht in seiner Syntax. – Taryn

+0

@tab ja ich habe das versucht, kein Würfel. – Eric

Antwort

3

Leider gibt es keine Möglichkeit, dies ohne dynamisches SQL zu tun. PIVOT erfordert, dass die Werte bekannt sind, wenn die Abfrage ausgeführt wird. Wenn Sie also unbekannte Namen haben, müssen Sie dynamisches SQL verwenden.

+1

Danke für die Antwort. Ich schalte immer gegen die Verwendung von dynamischen SQL, weil es ein inhärentes Sicherheitsrisiko sein kann. Ich nehme an, was ich tun werde, ist eine andere Tabelle var oder temporäre Tabelle erstellen, die eine Liste aller bekannten Sicherheitsattribute enthält, eine andere für Sicherheitsklassen, IDs usw. und Validierung der Eingabe für diese Liste (Whitelist die Parameter). – Eric

0

Ich habe noch nie von einer Möglichkeit gehört, dies mit einer Abfrage zu tun, aber ich erinnere mich, dass ich in der Lage war, dies in einem Bericht (SSRS) einzurichten, der wirklich ordentlich war. Je nachdem, was Sie mit den Daten tun möchten, könnte dies für Sie funktionieren.

+0

Das ist mit einer Matrixsteuerung (aka PIVOT TABLE). –