2009-06-18 8 views
3

En utilisant l'objet Microsoft.SqlServer.Management.Smo.Scripter, je génère des scripts pour chacune des tables de ma base de données, y compris les index/contraintes. Quand il génère le script, cependant, il inclut toutes les options d'index, même si elles sont les valeurs par défaut, par exemple,Suppression des options d'index relationnelles lors de la création d'un script dans Microsoft SQL Server 2005

CREATE TABLE [dbo].[AgeGroup](
    [AgeGroupID] [int] NOT NULL), 
CONSTRAINT [PK_AgeGroup] PRIMARY KEY CLUSTERED 
(
    [AgeGroupID] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], 

Toutes les options La clause de la contrainte de clé primaire sont réglées sur les valeurs par défaut (au moins selon la documentation en ligne de SQL Server). Comment puis-je obtenir l'objet Scripter à pas afficher ces options?

Voici mon code:

Server server = new Server("MYSERVER"); 

Scripter scripter = new Scripter(server); 
scripter.Options.Indexes = true; 
scripter.Options.AnsiPadding = true; 
scripter.Options.AnsiFile = true; 
scripter.Options.Permissions = true; 
scripter.Options.ClusteredIndexes = true; 
scripter.Options.DriAll = true; 

Urn[] urns = new Urn[1]; 

Table t = server.Databases["MYDATABASE"].Tables["AgeGroup"]; 
urns[0] = t.Urn; 

StringCollection sc = scripter.Script(urns); 

using (StreamWriter sw = File.CreateText("AgeGroup.Table.sql")) 
    foreach (string str in sc) 
     sw.WriteLine(str); 

Répondre

3

Apparemment, il n'y a pas d'options de script pour contrôler cela. Il y a plus de choses comme ça dans SMO.Scripting (c'est-à-dire, incontrôlées) que la plupart des gens réalisent. Par exemple, il n'y a pas d'option pour scripter les commandes ALTER au lieu de CREATES, même si SSMS le fait pour l'objet de modification de l'objet quick-menu.

Dans la plupart de ces cas que j'ai vus, il s'est avéré assez facile à gérer dans mon code en recherchant et en remplaçant le texte incriminé. Le scripteur est très rigide dans son format de sortie, donc je n'ai jamais eu besoin de RegEx pour le faire. Ainsi, quand vous avez le script CREATE pour un objet de table je chercherais ") WITH (PAD_INDEX) ON" et le remplacer par "ON" (assurez-vous que votre joker franchira les sauts de ligne).

+0

Telle est l'approche que j'ai fini prendre avant de voir ta réponse. Cela fonctionne bien. –

1

Vous pouvez obtenir presque ce que vous voulez en utilisant ceci:

private static Scripter CreateScripter

(serveur Server)

{ 
    Scripter returnValue = new Scripter(server); 
    returnValue.Options.TargetServerVersion = SqlServerVersion.Version90; 
    returnValue.Options.TargetDatabaseEngineType = DatabaseEngineType.SqlAzureDatabase; 
    returnValue.Options.NoTablePartitioningSchemes = true; 
    returnValue.Options.NoFileGroup = true; 
    return returnValue; 
} 

Le résultat est:

CREATE TABLE [dbo].[CacheData](
    [LastFileSystemUpdate] [uniqueidentifier] NOT NULL, 
CONSTRAINT [PK_CacheData] PRIMARY KEY CLUSTERED 
(
    [LastFileSystemUpdate] ASC 
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) 
) 
Questions connexes