动态透视列没有动态SQL语句?

时间:2016-06-30 18:09:18

标签: sql sql-server pivot sql-server-2014

我只是想知道是否有任何方法可以使用动态列名进行数据透视查询,而无需使用动态sql(declare @sql_text varchar(max) = 'select ...'等)。

动态SQL只是以错误的方式打磨我。

基本上我有这样的查询(我必须更改所有的表/列名称来保护IP,所以如果有某种语法错误,请不要担心它)

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
;

我希望能够使用表var (显示在注释中),而不是手动设置每个查询的列。我知道这对于动态SQL来说是可行且非常简单的,但是如果可能的话,我想避免这样做。

2 个答案:

答案 0 :(得分:3)

不幸的是,如果没有动态SQL,就无法做到这一点。 PIVOT要求在执行查询时知道值,因此如果您有未知的名称,则必须使用动态SQL。

答案 1 :(得分:0)

我从未听说过使用查询执行此操作的方法,但我记得我能够在报告(SSRS)中进行设置,这非常简洁。根据您计划对数据执行的操作,这可能对您有用。