Perché SQL Server richiede che la lunghezza del tipo di dati sia la stessa quando si utilizza un apice?

dba.stackexchange https://dba.stackexchange.com/questions/54353

  •  02-11-2019
  •  | 
  •  

Domanda

Quando si applica il UNPIVOT Funzione a dati che non sono normalizzati, SQL Server richiede che il tipo di dati e la lunghezza siano uguali. 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 di cui ho bisogno:

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 sballare il Firstname e Lastname colonne simili a:

select PersonId, ColumnName, Value  
from People
unpivot
(
  Value 
  FOR ColumnName in (FirstName, LastName)
) unpiv;

SQL Server genera l'errore:

MSG 8167, Livello 16, Stato 1, linea 6

Il tipo di colonna "LastName" è in conflitto con il tipo di altre colonne specificate nell'elenco Unpivot.

Per risolvere l'errore, dobbiamo usare una sottoquery per lanciare prima il 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;

Vedere Violino SQL con demo

Prima di essere introdotto Unpivot in SQL Server 2005, userei un SELECT insieme a UNION ALL per sbarcare il firstname/lastname Le colonne e la query funzionerebbero 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;

Vedere Violino SQL con demo.

Siamo anche in grado di sbloccare con successo i 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);

Vedere Violino SQL con demo.

Ho letto MSDN ma non ho trovato nulla che spieghi il ragionamento per forzare la lunghezza sul tipo di dati ad essere lo stesso.

Qual è la logica dietro che richiede la stessa lunghezza quando si utilizza un doppio?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top