Удалите параметры реляционного индекса при создании сценария индекса таблицы в SQL Server 2005

Используя объект Microsoft.SqlServer.Management.Smo.Scripter, я создаю сценарии для каждой таблицы в моей базе данных, включая индексы/ограничения. Однако когда он генерирует сценарий, он включает все параметры индекса, даже если они являются значениями по умолчанию, например,

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],

Для всех параметров в предложении WITH ограничения первичного ключа установлены значения по умолчанию (по крайней мере, согласно электронной документации по SQL Server). Как заставить объект Scripter не выводить эти параметры?

Вот мой код:

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

person Aaron Jensen    schedule 18.06.2009    source источник


Ответы (2)


По-видимому, нет никаких опций сценариев, чтобы контролировать это. Таких вещей в SMO.Scripting (т. е. неконтролируемых) гораздо больше, чем думает большинство людей. Например, нет возможности записывать команды ALTER вместо CREATES, даже несмотря на то, что SSMS делает это для пункта Modify в быстром меню объекта.

В большинстве этих случаев, которые я видел, оказалось довольно легко справиться с этим в моем коде, сканируя и, если находя, заменяя оскорбительный текст. Скриптер очень жестко подходит к форматированию вывода, поэтому мне даже не нужны были RegEx для этого. Итак, когда у вас есть сценарий CREATE для табличного объекта, я бы искал «) WITH (PAD_INDEX) ON» и заменял его на «ON» (убедитесь, что ваш подстановочный знак пересекает строку перерывы).

person RBarryYoung    schedule 18.06.2009
comment
Это подход, который я выбрал, прежде чем увидел ваш ответ. Это работает хорошо. - person Aaron Jensen; 23.06.2009

Вы можете получить почти то, что хотите, используя это:

частный статический скриптер CreateScripter(сервер сервер)

{
    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;
}

Результат:

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