Al aplicar la UNPIVOT
función a datos que no están normalizados, SQL Server requiere que el tipo de datos y la longitud sean los mismos. Entiendo por qué el tipo de datos debe ser el mismo, pero ¿por qué UNPIVOT requiere que la longitud sea la misma?
Digamos que tengo los siguientes datos de muestra que necesito desconectar:
CREATE TABLE People
(
PersonId int,
Firstname varchar(50),
Lastname varchar(25)
)
INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');
Si intento UNPIVOT las columnas Firstname
y Lastname
similares a:
select PersonId, ColumnName, Value
from People
unpivot
(
Value
FOR ColumnName in (FirstName, LastName)
) unpiv;
SQL Server genera el error:
Mensaje 8167, Nivel 16, Estado 1, Línea 6
El tipo de columna "Apellido" entra en conflicto con el tipo de otras columnas especificadas en la lista UNPIVOT.
Para resolver el error, debemos usar una subconsulta para emitir primero la Lastname
columna para que tenga la misma longitud que Firstname
:
select PersonId, ColumnName, Value
from
(
select personid,
firstname,
cast(lastname as varchar(50)) lastname
from People
) d
unpivot
(
Value FOR
ColumnName in (FirstName, LastName)
) unpiv;
Antes de que UNPIVOT se introdujera en SQL Server 2005, usaría un SELECT
con UNION ALL
para desenredar las columnas firstname
/ lastname
y la consulta se ejecutaría sin la necesidad de convertir las columnas a la misma longitud:
select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;
Ver SQL Fiddle con Demo .
También podemos desenredar con éxito los datos usando CROSS APPLY
sin tener la misma longitud en el tipo de datos:
select PersonId, columnname, value
from People
cross apply
(
select 'firstname', firstname union all
select 'lastname', lastname
) c (columnname, value);
Ver SQL Fiddle con Demo .
He leído a través de MSDN pero no encontré nada que explique el razonamiento para forzar que la longitud del tipo de datos sea la misma.
¿Cuál es la lógica detrás de requerir la misma longitud cuando se usa UNPIVOT?