UNPIVOT
İşlevi normalleştirilmemiş verilere uygularken , SQL Server veri türünün ve uzunluğunun aynı olmasını gerektirir. Veri tipinin neden aynı olması gerektiğini anlıyorum ama UNPIVOT neden aynı uzunlukta olmasını gerektiriyor?
Diyelim ki, kaldırmam gereken aşağıdaki örnek verilere sahibim:
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');
UNPIVOT Firstname
ve Lastname
sütunlarını benzer şekilde denemeye çalışırsam :
select PersonId, ColumnName, Value
from People
unpivot
(
Value
FOR ColumnName in (FirstName, LastName)
) unpiv;
SQL Server, hatayı oluşturur:
Mesaj 8167, Seviye 16, Durum 1, Satır 6
"Soyadı" sütununun türü, UNPIVOT listesinde belirtilen diğer sütunların türüyle çakışıyor.
Hatayı gidermek için, ilk önce Lastname
aynı uzunluğa sahip olacak şekilde sütunu yayınlamak için bir alt sorgu kullanmalıyız 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;
Demo ile SQL Fiddle'ı görün
UNPIVOT'un SQL Server 2005'te piyasaya sürülmesinden önce , / sütunları çıkarmak için SELECT
ile birlikte kullanacağım ve sorgu, sütunları aynı uzunluğa dönüştürmeye gerek kalmadan çalışacaktı:UNION ALL
firstname
lastname
select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;
Demo ile SQL Fiddle'a bakınız .
Ayrıca CROSS APPLY
, veri türünde aynı uzunlukta olmadan verileri başarıyla çıkartabiliyoruz :
select PersonId, columnname, value
from People
cross apply
(
select 'firstname', firstname union all
select 'lastname', lastname
) c (columnname, value);
Demo ile SQL Fiddle'a bakınız .
MSDN aracılığıyla okudum ama veri türünün uzunluğu aynı olmaya zorlama nedenini açıklayan bir şey bulamadım.
UNPIVOT kullanırken aynı uzunluğu gerektiren arkasındaki mantık nedir?