Question

Je dois copier une table que j'ai déjà dans une base de données SQL Server, mais je n'ai pas besoin des données contenues dans la table source. Les exemples que j'ai trouvés ne concernent que la copie des données.

Voici les détails:

  1. Copiez la structure de la table uniquement, pas les données.
  2. Les tables source et cible se trouvent dans la même base de données.
  3. La table cible n'existe pas encore.
  4. Besoin de le faire par programme
  5. Il serait bien de copier également les propriétés connexes de la table / des colonnes.
Était-ce utile?

La solution

sélectionnez * dans new_table à partir de old_table où 1 = 0

Exécutez la commande ci-dessus par programmation.

Autres conseils

Créez un script dans la table, modifiez le nom de la table dans le script, exécutez le script.

Je parie avec SMO que vous pouvez le faire sans problème:

  • lisez la structure de votre " ancien " tableau en variables en mémoire
  • utiliser cette information de structure pour créer la nouvelle table

J'ai rapidement trouvé quelques articles intéressants montrant au moins une partie de la solution:

Donc, fondamentalement, cela se résumerait à quelque chose comme ceci:

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();

Bien sûr, il y a plus de propriétés sur le " Column " que vous voudrez peut-être copier, mais aussi copier des index, des contraintes, etc. - travail supplémentaire.

Je suis perplexe sur le fait qu'il n'y a pas de moyen plus simple de dupliquer un " Column " object à un nouveau (une méthode similaire à une méthode .Clone ()) - cela n’est peut-être pas un scénario prioritaire, je ne sais pas ....

J'espère que ça aide!

Marc

Dans SQL Management Studio, cliquez avec le bouton droit de la souris sur le nom de la table et sur la table de script en tant que | CRÉER POUR ... | Nouvelle fenêtre de l'éditeur de requêtes. Cela vous donnera un script que vous pouvez exécuter sous n’importe quelle base de données.

Si vous utilisez .NET, vous pouvez utiliser les objets de gestion de serveur:

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);

Vous devez remplacer les noms de la table et des objets associés (par exemple, FK_OldTableName_xxx par FK_NewTableName_xxx) dans le script généré:

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

Et ensuite exécutez:

db.Execute(sb.ToString());

Notez qu'il s'agit d'un code assez naïf: il ne fonctionnera que si les noms de vos contraintes et de vos clés suivent le format suivant: FK_OldTableName_xxx / CK_OldTableName_xxx .. s'ils ont d'autres noms, vous devrez renforcer le code de remplacement de chaîne, probablement en utilisant Regexes pour rechercher des modèles de création d’objets T-SQL (CREATE INDEX, FOREIGN KEY .. etc).

Devez-vous le faire automatiquement (sans interférence manuelle)?

Sinon, vous pouvez toujours utiliser SQL Server Management Studio pour générer des scripts CREATE pour les tables que vous souhaitez copier et l'exécuter sur la base de données cible.

Cliquez avec le bouton droit sur l'objet souhaité, sélectionnez Générer le script, puis choisissez le script à générer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top