2014-09-10 9 views
6

Ho un progetto di database di SQL Server in cui ho apportato diverse modifiche allo schema in cui ho modificato i tipi di dati di colonna da NUMERIC (18,0) a INT. Stiamo cercando di normalizzare il tipo di dati utilizzato per Primary Keys, è un mix attualmente 50/50.Come funziona il progetto del database SQL Server: pubblicazione decidere quando ricreare una tabella?

Quando ho generare lo script Pubblicare, alcune delle tabelle sono ricreati nello script:

CREATE TABLE [dbo].[tmp_XYZ] 
INSERT TABLE [dbo].[tmp_XYZ] SELECT ... FROM [dbo].[XYZ] 
DROP TABLE [dbo].[XYZ] 
sp_rename N'[dbo].[tmp_XYZ]', N'XYZ'; 

ma altri tavoli sono appena aggiornato tramite ALTER dichiarazioni

ALTER TABLE [dbo].[ABC] ALTER COLUMN [AbcID] INT NULL;

C'è qualche regola che determina quando verrà ricreato un tavolo e quando è appena alterato sul posto?

+0

Non è possibile modificare una definizione di colonna se fa parte di una chiave/indice. Eliminare le chiavi, cambiare la definizione e quindi ricostruire le chiavi sarà, in generale, più costoso della semplice costruzione della struttura parallela con la nuova definizione, quindi abbandonare la vecchia e rinominare. –

risposta

0

Probabilmente il modo migliore è fare clic con il pulsante destro sul nome dell'oggetto e scegliere lo script come ... Quindi hai opzioni per creare o modificare Se non hai trovato Alter, puoi andare in visualizzazione struttura, fare clic con il pulsante destro del mouse e scegli Genera script di modifica ... per trovare la dichiarazione di alterazione.

0

Questo è solo un problema facile. È lo stesso problema di cambiare una tabella nella finestra di progettazione. Penso che tu abbia modificato una colonna all'interno del tuo progetto di tabella che ha bisogno di rilasciare e ricreare la tabella per lasciare l'ordine della colonna nella stessa posizione.

Ecco un breve esempio. Prendi questo disegno del tavolo come indicato:

CREATE TABLE dbo.Test(
    id int identity(1,1), 
    firstname nvarchar(100), 
    name nvarchar(100), 
    street nvarchar(100) 
) 

Questo creerà le colonne in un ordine specificato. Si può vedere questo ordine qui:

SELECT name, column_id 
FROM sys.columns 
WHERE object_id = OBJECT_ID(N'dbo.Test') 

vedrete qualcosa di simile:

column_name column_id 
id   1 
firstname 2 
name  3 
street  4 

Se si modifica la colonna name tramite progettista o nel tuo caso nel progetto di dati, questo farà sì che SQL Server per ottenere questo ordine in posizione verticale. In questo caso si prova a cambiare la colonna name in lastname. Ciò imporrà SQL Management Studio e altri programmi simili per mantenere lo column_id in posizione verticale. Questo può essere fatto solo se il tavolo è completamente ricreato con il giusto ordine di colonna. SQL Server crea uno stub di tabella temporaneo, inserisce tutto in esso, rilascia la tabella precedente e rinomina la tabella temporanea con il nome originale precedente. Proprio come nel tuo codice qui sopra.

Dopo che vedrete qualcosa di simile:

column_name column_id 
id   1 
firstname 2 
lastname 3 
street  4 

Se si desidera semplicemente rinominare l'ultima colonna o farlo manualmente, tutto sarebbe andato bene. Manualmente sarebbe molto più efficiente, in quanto non è necessario spostare TUTTI i dati in una nuova tabella. Il modo manuale sarebbe questo:

-- Create the new column 
ALTER TABLE dbo.Test ADD lastname nvarchar(100) 
GO 
-- Populate the new column using the old one 
UPDATE dbo.Test 
SET lastname = name 
GO 
-- Drop the old column afterwards 
ALTER TABLE dbo.Test DROP COLUMN name 

Questo comportamento comporterà il seguente risultato:

column_name column_id 
id   1 
firstname 2 
street  4 
lastname 5 

L'ultimo sarà molto più efficiente, come già detto.

Speriamo che questo risponda alla tua domanda, anche se la risposta arriva di recente.

Problemi correlati