Quando si applica la UNPIVOT
funzione a dati non normalizzati, SQL Server richiede che il tipo di dati e la lunghezza siano gli stessi. Capisco perché il tipo di dati deve essere lo stesso, ma perché UNPIVOT richiede che la lunghezza sia la stessa?
Diciamo che ho i seguenti dati di esempio che devo annullare la rotazione:
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');
Se provo a UNPIVOT le colonne Firstname
e Lastname
simili a:
select PersonId, ColumnName, Value
from People
unpivot
(
Value
FOR ColumnName in (FirstName, LastName)
) unpiv;
SQL Server genera l'errore:
Messaggio 8167, livello 16, stato 1, riga 6
Il tipo di colonna "Cognome" è in conflitto con il tipo di altre colonne specificato nell'elenco UNPIVOT.
Per risolvere l'errore, è necessario utilizzare una sottoquery per eseguire innanzitutto il cast della Lastname
colonna per avere la stessa lunghezza di 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;
Vedi SQL Fiddle with Demo
Prima che UNPIVOT fosse introdotto in SQL Server 2005, avrei usato un SELECT
con UNION ALL
per annullare la rotazione delle colonne firstname
/ lastname
e la query sarebbe stata eseguita senza la necessità di convertire le colonne alla stessa lunghezza:
select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;
Vedi SQL Fiddle with Demo .
Siamo anche in grado di annullare la rotazione dei dati utilizzando CROSS APPLY
senza avere la stessa lunghezza sul tipo di dati:
select PersonId, columnname, value
from People
cross apply
(
select 'firstname', firstname union all
select 'lastname', lastname
) c (columnname, value);
Vedi SQL Fiddle with Demo .
Ho letto tramite MSDN ma non ho trovato nulla che spiegasse il ragionamento per forzare la lunghezza sul tipo di dati a essere la stessa.
Qual è la logica che richiede la stessa lunghezza quando si utilizza UNPIVOT?