Lors de l'application de la UNPIVOT
fonction à des données qui ne sont pas normalisées, SQL Server requiert que le type de données et la longueur soient identiques. Je comprends pourquoi le type de données doit être le même, mais pourquoi UNPIVOT exige-t-il que la longueur soit la même?
Disons que j'ai les exemples de données suivants que je dois débloquer:
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 j'essaye de UNPIVOT les colonnes Firstname
et Lastname
similaires à:
select PersonId, ColumnName, Value
from People
unpivot
(
Value
FOR ColumnName in (FirstName, LastName)
) unpiv;
SQL Server génère l'erreur:
Msg 8167, niveau 16, état 1, ligne 6
Le type de colonne "Nom" est en conflit avec le type des autres colonnes spécifiées dans la liste UNPIVOT.
Afin de résoudre l'erreur, nous devons utiliser une sous-requête pour lancer d'abord la Lastname
colonne pour avoir la même longueur 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;
Voir SQL Fiddle avec démo
Avant d'introduire UNPIVOT dans SQL Server 2005, j'utilisais un SELECT
avec UNION ALL
pour annuler le pivotement des colonnes firstname
/ lastname
et la requête s'exécuterait sans avoir besoin de convertir les colonnes à la même longueur:
select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;
Voir SQL Fiddle avec démo .
Nous sommes également en mesure de débloquer les données avec succès CROSS APPLY
sans avoir la même longueur sur le type de données:
select PersonId, columnname, value
from People
cross apply
(
select 'firstname', firstname union all
select 'lastname', lastname
) c (columnname, value);
Voir SQL Fiddle avec démo .
J'ai lu MSDN mais je n'ai rien trouvé qui explique le raisonnement pour forcer la longueur du type de données à être la même.
Quelle est la logique derrière l'exigence de la même longueur lors de l'utilisation d'UNPIVOT?