Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Inserimento colonna in una determinata posizione

773 views
Skip to first unread message

Simone B

unread,
Nov 28, 2006, 7:40:43 AM11/28/06
to
Ciao a tutti.

Sono nuovo del mondo SQL; lo utilizzo da qualche mese.
A codice (utilizzo Visual Studio 2005, C#, SQL 2005) o tramite un oggetto
del framework o tramite un comando SQL, vorrei aggiungere una colonna ad una
tabella, in una determinata posizione.
Riesco tramite ALTER TABLE ad aggiungere una colonna, ma questa va in fondo
all'elenco. Quale opzione posso specificare perchè la colonna venga inserita
nella posizione x?
Vorrei fare una cosa analoga a Management Studio, ma da codice.

Esempio elenco campi tabella Pippo:
Campo1, Campo2, Data, Utente
vorrei inserire Campo3 prima di Data e dopo Campo2

Grazie a tutti coloro che mi vorranno aiutare.

Simone


Luca Bianchi

unread,
Nov 28, 2006, 7:58:59 AM11/28/06
to
> Riesco tramite ALTER TABLE ad aggiungere una colonna, ma questa va in
> fondo all'elenco. Quale opzione posso specificare perchè la colonna venga
> inserita nella posizione x?
> Vorrei fare una cosa analoga a Management Studio, ma da codice.

I comandi T-SQL per aggiungere un campo finiscono qui. Non esiste la
possibilità di specificare la posizione di una colonna ma è altrettanto vero
che da un punto di vista concettuale non dovrebbe avere alcun senso la
posizione fisica dei campi in una tabella; l'ordine dei campi dovrebbe
essere specificato in fase di estrazione dei dati dove puoi specificare un
ordine dei campi arbitrario a prescindere dalla struttura dati sottostante.

Quello che esegue SSMS attraverso l'interfaccia grafica (ed era così anche
con Enterprise Manager in SQL Server 2000) è in realtà una macro attività
che comprende la creazione di una nuova tabella (con i relativi constraint)
con i campi nell'ordine voluto, il travaso dei dati, la rimozione della
vecchia tabella ed il rename della nuova con il nome della vecchia. Se
attivi una traccia di Profiler oppure se decidi di salvare lo script senza
eseguirlo trovi testimonianza della cosa...

> Grazie a tutti coloro che mi vorranno aiutare.
>
> Simone

Bye

--
Luca Bianchi
Microsoft MVP - SQL Server
http://blogs.aspitalia.com/lucabianchi

Sandro Bizioli

unread,
Nov 28, 2006, 8:16:25 AM11/28/06
to
Il /28 nov 2006/, *Simone B* ha scritto:

> vorrei aggiungere
> una colonna ad una tabella, in una determinata posizione.
> Riesco tramite ALTER TABLE ad aggiungere una colonna, ma questa va
> in fondo all'elenco. Quale opzione posso specificare perchè la
> colonna venga inserita nella posizione x?
> Vorrei fare una cosa analoga a Management Studio, ma da codice.

L'istruzione Alter Table ti permette di aggiungere la colonna, ma come
avrai notato tu, viene aggiunta sempre in coda.
Non vi è modo di specificare l'ordine delle colonne (se non in fase di
creazione), anche perchè è decisamente inutile. Non si hanno
prestazioni differenti a seconda della posizione di una colonna.

L'unica soluzione è quella di creare una nuova tabella esattamente
identica alla precedente, ma con il nuovo ordine delle colonne,
copiarvi dentro tutti i dati, eliminare la precedente e rinominare la
nuova con il nome della precedente. Non dimentichiamo indici, chiavi e
vincoli.

Questo è esattamente quello che vedi i SSMS o con EM per SQL Server
2000. Entrambi i programmi utilizzano l'istruzione alter table, ma
dietro le quinte, effettuano tutte quelle simpatiche operazioni.

Questo è il codice che viene generato quando si chiede a SSMS o EM di
aggiungere una colonna in una particolare posizione:


BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Pippo
(
Campo1 varchar(25) NULL,
Campo2 varchar(25) NULL,
Campo3 varchar(25) NULL,
Data smalldatetime NULL,
Utente varchar(25) NULL
) ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.Pippo)
EXEC('INSERT INTO dbo.Tmp_Pippo (Campo1, Campo2, Data, Utente)
SELECT Campo1, Campo2, Data, Utente FROM dbo.Pippo WITH
(HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.Pippo
GO
EXECUTE sp_rename N'dbo.Tmp_Pippo', N'Pippo', 'OBJECT'
GO
COMMIT

--
(Postate i comandi DDL per la creazione delle tabelle)
===================================
Sandro Bizioli
http://blogs.dotnethell.it/sandro/
===================================

Simone B

unread,
Nov 28, 2006, 8:35:13 AM11/28/06
to
Grazie molte per la spiegazione!!
In effetti concordo anch'io con il fatto che l'ordine nelle SELECT non abbia
importanza.
La questione è che ho problemi con una istruzione
System.Data.SqlClient.SqlBulkCopy e davo la colpa al fatto che l'ordine non
fosse lo stesso dei dati sorgente.
Cioè tabella sorgente:
Campo1, Campo2, Campo3, Data, Utente
tabella di destinazione:
Campo1, Campo2, Data, Utente, Campo3
la bulkcopy mi va in errore.

Provo a questo punto ad intensificare i controlli della funzione incaricata.

Grazie ancora!

Simone


"Luca Bianchi" <rightjoinR...@hotmail.com> ha scritto nel messaggio
news:4t2q4mF...@mid.individual.net...

Lorenzo Benaglia

unread,
Nov 28, 2006, 8:40:18 AM11/28/06
to
Simone B wrote:
> La questione č che ho problemi con una istruzione

> System.Data.SqlClient.SqlBulkCopy e davo la colpa al fatto che
> l'ordine non fosse lo stesso dei dati sorgente.
> Cioč tabella sorgente:

> Campo1, Campo2, Campo3, Data, Utente
> tabella di destinazione:
> Campo1, Campo2, Data, Utente, Campo3
> la bulkcopy mi va in errore.

Ciao Simone B,

in questo caso sei costretto a ricorrere ad un file di formato che
specifichi la mappatura tra le colonne delle due tabelle.
Ogni dettaglio sui Books Online.
http://msdn2.microsoft.com/en-us/library/ms191479.aspx

> Grazie ancora!
Prego.

Ciao!

--
Lorenzo Benaglia


Microsoft MVP - SQL Server

http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org


Simone B

unread,
Nov 28, 2006, 9:43:01 AM11/28/06
to
Molte grazie per le info ed il notevole dettaglio!
Vedo di aggirare il mio problema agendo in altro modo!

Ciao :-)

Simone

"Sandro Bizioli" <sanbizRE...@lombardiacom.it> ha scritto nel
messaggio news:Xns98899133...@207.46.248.16...

0 new messages