Удалите параметры реляционного индекса при индексировании таблицы сценариев в SQL Server 2005 - PullRequest
3 голосов
/ 19 июня 2009

Используя объект 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);

Ответы [ 2 ]

3 голосов
/ 19 июня 2009

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

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

1 голос
/ 03 мая 2012

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

приватный статический сценарий 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)
)
...