2009-07-31 21 views
7

Ho bisogno di copiare una tabella che ho già in un database del server SQL, ma non ho bisogno dei dati contenuti nella tabella di origine. Gli esempi che ho trovato riguardano solo la copia dei dati.Come copiare una tabella in SQL Server, senza i dati?

Ecco i dettagli: solo

  1. Copia la struttura della tabella, non i dati.
  2. Le tabelle di origine e destinazione si trovano nello stesso database.
  3. La tabella di destinazione non esiste ancora.
  4. bisogno di fare questo a livello di codice
  5. Sarebbe bello avere alcuna proprietà correlate della tabella/colonne essere copiati pure.
+0

Quale lingua/piattaforma? C#? – MusiGenesis

+0

C# e ASP.NET, ma questo non importa molto. Sto più cercando l'SQL che avrei bisogno di eseguire. –

+0

Non sto seguendo abbastanza. L'SQL che dovresti eseguire è lo script CREATE TABLE con il nome della tabella modificato, come discusso nelle risposte. È necessario sapere come generare in modo programmatico questo script da SQL Server (cambiare il nome della tabella una volta che ciò non è troppo difficile), per cui la lingua è rilevante. Non conosco la risposta a questo, e sono interessato a vedere come questo può essere fatto. – MusiGenesis

risposta

6

selezionare * in new_table da old_table dove 1 = 0

Eseguire il comando precedente programmazione.

+0

quello che stavo pensando, ma non farà nulla di "extra", indice, vincoli, valori predefiniti, pk, fk. Identificherà, però ... –

+0

Bello, ma non copierà chiavi primarie/esterne, colonne di identità, vincoli, ecc. (OP potrebbe non aver bisogno di queste cose, però.) –

+0

@ Ben M, farà le identità –

3

Script la tabella, modifica il nome della tabella nello script, esegui lo script.

+1

Scusa se dovrei inserire la domanda che voglio fare a livello di codice. –

1

In SQL Management Studio, fare clic con il pulsante destro del mouse sul nome tabella e sulla tabella di script come | CREA A ... | Nuova finestra dell'editor di query. Questo ti darà uno script che puoi eseguire in qualsiasi database.

+0

Qualsiasi database tranne il DB originale, che è ciò di cui ha bisogno il richiedente. – MusiGenesis

0

È necessario eseguire questa operazione automaticamente (senza interferenze manuali)?

In caso contrario, è sempre possibile utilizzare SQL Server Management Studio per generare gli script CREATE per le tabelle che si desidera copiare ed eseguirli nel database di destinazione.

Fare clic con il pulsante destro del mouse sull'oggetto desiderato, selezionare generare script e scegliere lo script da generare.

+0

Deve essere automatico. –

2

Scommetto con SMO si può fare questo non è un problema:

  • leggere la struttura della tabella "vecchio" in variabili in memoria
  • utilizzo queste informazioni struttura per creare la nuova tabella

ho trovato subito un paio di articoli interessanti che mostrano almeno una parte della soluzione:

Quindi, in pratica sarebbe riducono a qualcosa di simile:

Server localServer = new Server("(local)"); 
Database testDB = localServer.Databases["test"]; 

Table myTable = testDB.Tables["TestFiles"]; 
myTable.Refresh(); 

Table newTable = new Table(testDB, "MyNewTableName"); 

foreach(Column col in myTable.Columns) 
{ 
    Column newColumn = new Column(newTable, col.Name); 

    newColumn.DataType = col.DataType; 
    newColumn.Default = col.Default; 
    newColumn.Identity = col.Identity; 
    newColumn.IdentityIncrement = col.IdentityIncrement; 
    newColumn.IdentitySeed = col.IdentitySeed; 
    newColumn.Nullable = col.Nullable; 

    newTable.Columns.Add(newColumn); 
} 

newTable.Create(); 

Naturalmente, ci sono più proprietà sulla "Colonna", che si potrebbe desiderare di copiare, più si potrebbe anche voler per copiare indici, vincoli ecc. - lavoro extra.

Sono perplesso sul fatto che non vi è un modo più semplice per duplicare un oggetto "Colonna" in uno nuovo (qualcosa come un metodo .Clone()) per facilitare questo - forse non è uno scenario con priorità assoluta, Non lo so....

Spero che questo aiuti!

Marc

+0

Potremmo sempre aggiungere un metodo di estensione clone :) –

+0

@SkippyFire: sicuro - Ero solo perplesso che non è già lì. –

1

Se stai usando .NET, è possibile utilizzare Server Management Objects:

var so = new ScriptingOptions(); 
so.Triggers = true; 
so.DriForeignKeys = true; 
so.DriDefaults = true; 
so.DriAllConstraints = true; 
so.DriAllKeys = true; 
so.DriIndexes = true; 
so.DriUniqueKeys = true; 
so.DriPrimaryKey = true; 
so.Indexes = true; 
so.Default = true; 
so.ClusteredIndexes = true; 
so.IncludeDatabaseContext = true; 
so.TargetServerVersion = SqlServerVersion.Version90; 

var server = new Server("ServerName"); 
var db = server.Databases["DatabaseName"]; 
var stringColl = db.Tables["Table"].Script(so); 

avresti bisogno di sostituire i nomi della tabella e gli oggetti associati (ad esempio FK_OldTableName_xxx con FK_NewTableName_xxx) nello script generato:

var sb = new StringBuilder(); 
foreach(var s in stringColl) 
{ 
    var r = s.Replace("OldTableName", "NewTableName"); 
    sb.AppendLine(r); 
} 

E poi eseguire:

db.Execute(sb.ToString()); 

Si noti che questo è un codice piuttosto ingenuo: funzionerà solo se i nomi dei propri vincoli e chiavi seguono il formato: FK_OldTableName_xxx/CK_OldTableName_xxx .. se hanno altri nomi, sarà necessario rinforzare il codice di sostituzione della stringa , probabilmente usando Regexes per cercare modelli di creazione di oggetti T-SQL (es CREA INDICE, CHIAVE ESTERA .. ecc.).

+0

marc_s's è un altro approccio che utilizza SMO e sebbene un maggior lavoro da implementare sia probabilmente meno incline agli errori del mio se si desidera eseguire questa attività in un'ampia varietà di situazioni. –

+0

Sì, sembra giusto, ma grazie per questa informazione, Ben! Questo potrebbe sicuramente tornare utile per altri scopi, come la generazione automatica di script di backup e cose del genere. –

Problemi correlati