2009-06-18 11 views
3

Mit dem Microsoft.SqlServer.Management.Smo.Scripter-Objekt erzeuge ich Skripts für jede der Tabellen in meiner Datenbank, einschließlich Indizes/Einschränkungen. Wenn es das Skript erzeugt, jedoch enthält es alle Optionen Index, auch wenn sie die Standardwerte sind zBEntfernen Sie relationale Indexoptionen beim Skripten von Tabellenverzeichnissen in 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], 

alle Optionen in der WITH-Klausel der Definition des Primärschlüssels auf die Standardwerte gesetzt (Zumindest gemäß SQL Server-Onlinedokumentation). Wie kann ich das Scripter-Objekt auf nicht diese Optionen ausgeben?

Hier ist mein 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); 

Antwort

3

Anscheinend gibt es keine Scripting-Optionen, die zu steuern. Es gibt mehr Dinge wie das in SMO.Scripting (d. H. Unkontrolliert), als die meisten Leute erkennen. Zum Beispiel gibt es keine Option, um ALTER-Befehle anstelle von CREATES zu skripten, obwohl SSMS dies für das Objekt-Quick-Menü Modify-Item tut.

In den meisten dieser Fälle, die ich gesehen habe, stellte sich heraus, dass es ziemlich einfach war, es in meinem Code zu handhaben, indem ich nach dem anstößigen Text suchte und ihn fand. Der Scripter ist in seiner Ausgabeformatierung sehr steif, so dass ich RegEx's dafür nie benötigt habe. Also, wenn Sie das CREATE-Skript für ein Tabellenobjekt haben, würde ich nach ") WITH (PAD_INDEX) ON" suchen und es durch "ON" ersetzen (stellen Sie sicher, dass Ihr Platzhalter die Zeilenumbrüche kreuzt).

+0

Dies ist der Ansatz, den ich beendet nehmen, bevor ich deine Antwort sah. Es funktioniert gut. –

1

Sie können fast bekommen, was Sie, indem Sie diese wollen:

private static Scripter CreateScripter (Server-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; 
} 

Das Ergebnis ist:

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