SQL Server: preservare campi calcolati con SELECT INTO
-
29-08-2019 - |
Domanda
La mia azienda ha eseguito una migrazione dei dati di recente (in un database SQL Server 2005) e abbiamo notato che alcune tabelle create con SELECT INTO non hanno mantenuto i campi calcolati delle tabelle originali, ma invece di SQL Server creati campi regolari con il tipo restituito dal calcolo originale. Per esempio, supponiamo che avete questa tabella:
create table Example (
id int not null,
quantity decimal(19,5) not null,
price decimal(19,5) not null,
total as price*quantity
)
dopo aver fatto un SELECT * INTO Example2 dell'esempio si ottiene:
create table Example2 (
id int not null,
quantity decimal(19,5) not null,
price decimal(19,5) not null,
total decimal(38,9) null
)
ho riparato cadere i campi cattivi e li ricrea, ma voglio sapere se c'è un modo per mantenere i campi calcolati nella tabella creata con il SELECT INTO (magari con qualche configurazione speciale di SQL Server o utilizzando uno SQL alternativa di comando).
Grazie in anticipo.
Soluzione
Non credo che si sarebbe in grado di fare questo con SELECT INTO -. Proprio come se si stesse selezionando su una vista, è solo prendendo i risultati e il pompaggio ad una nuova tabella
È probabile che tu debba creare la tabella con le colonne calcolate prima, poi fare un inserto regolare dalla tabella di origine delle colonne non calcolate.
Altri suggerimenti
A seguito della politica è meglio evitare di usare SELECT INTO per creare tabelle soprattutto in una migrazione. Non solo si perde i calcoli, si perderanno gli indici, trigger e probabilmente eventuali inadempienze o vincoli. In una migrazione si dovrebbe sempre di script fuori le tabelle che si desidera spostare inclusi trigger, indici, ecc
La mia comprensione è che la nuova tabella viene creata dai tipi di dati nel set di record. Tuttavia set di record non contiene informazioni su come i valori risultanti vengono generati - quindi la formula di calcolo viene persa. (Come esempio estremo, pensare a una vista contenente un GROUP BY come sorgente per un SELECT INTO)