consulta cruzada dinámica supera la longitud máxima de varchar

votos
0

He estado tratando de convertir filas de columnas en SQL.

Al igual que este:

|*Name*|*Permissions*|
|App1  |Permission 1 |
|App1  |Permission 2 |
|App1  |Permission 3 |
|App2  |Permission 1 |
|App2  |Permission 2 |
|App2  |Permission 3 |

a esto:

|*Name*|*Permission1*|*Permission2*|*Permission3*|
|App1  |Permission 1 |Permission 2 |Permission 3 |
|App2  |Permission 1 |Permission 2 |Permission 3 |

Por tanto, he estado usando algo así como el código para generar dinámicamente la consulta

declare @permission_id as VARCHAR(7);
declare @counter as int;
declare @query as VARCHAR(MAX);
declare @name as VARCHAR(15);

set @permission_id = 'permission_';
set @query = 'SELECT a.title, ';
set @counter = 0;

WHILE @counter < 3
BEGIN
    PRINT @counter;
    SET @counter = @counter + 1;
    SET @name = (SELECT CONCAT(@permission_id, @counter));
    SET @query = @query + ' select max(case when seqnum = '
    SET @query = (SELECT CONCAT(@query, @counter))
    SET @query = @query + ' then a.permission end) as '
    SET @query = (SELECT CONCAT(@query, @name))

END

que genera una consulta como la siguiente:

select a.name,
       max(case when seqnum = 1 then a.permission end) as permission_1,
       max(case when seqnum = 2 then a.permission end) as permission_2,
       max(case when seqnum = 3 then a.permission end) as permission_3
from (select a.*,
             row_number() over (partition by a.name order by a.name) as seqnum
      from apps a
     ) a
group by a.name;

El resultado está bien trabajando para hasta 120 permisos, ya que es el punto en el que la consulta excede la longitud máxima de varchar.

No he encontrado una solución para el pivote-ción dinámico sin concating una consulta todavía, y tampoco lo hice encontrar una solución para una consulta más tiempo.

Es por eso que estoy haciendo esta pregunta.

¿Hay una manera de pivote dinámico sin CONCAT-ing una consulta o hay algo que pueda usar en lugar de varchar?

¡Gracias!

Publicado el 09/10/2019 a las 18:52
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more