在SQL Server 2005中编写表索引时删除关系索引选项

时间:2009-06-18 20:13:00

标签: sql-server-2005 smo

使用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 个答案:

答案 0 :(得分:3)

显然,没有脚本选项来控制它。 SMO.Scripting(即不受控制的)比大多数人意识到的更多。例如,没有选项来编写脚本ALTER命令而不是CREATES,即使SSMS为对象快速菜单修改项目执行此操作。

在我见过的大多数情况下,通过扫描并且如果找到,替换违规文本,在我的代码中处理它变得相当容易。脚本编写器的输出格式非常严格,所以我甚至都不需要RegEx来执行此操作。因此,当您获得表对象的CREATE脚本时,我会搜索“)WITH(PAD_INDEX )ON”并将其替换为“ON”(确保您的通配符将越过该行符)。

答案 1 :(得分:1)

使用此功能,您几乎可以获得所需内容:

private static Sc​​ripter 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)
)
相关问题