3

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 Books Online によると)。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);
4

2 に答える 2

3

どうやら、それを制御するためのスクリプト オプションはありません。ほとんどの人が認識しているよりも、SMO.Scripting にはそのような (つまり、制御されていない) ことがたくさんあります。たとえば、SSMS はオブジェクトのクイック メニューの [変更] 項目に対してスクリプトを実行しますが、CREATES の代わりに ALTER コマンドをスクリプト化するオプションはありません。

私が見たこれらのケースのほとんどでは、問題のあるテキストをスキャンし、見つかった場合は置き換えることで、コードでそれを処理するのはかなり簡単であることが判明しました。スクリプターは出力の書式設定が非常に厳格であるため、これを行うために RegEx を必要とすることさえありませんでした。したがって、テーブル オブジェクトの CREATE スクリプトを取得したら、" ) WITH (PAD_INDEX ) ON " を検索し、" ON " に置き換えます (ワイルドカードが改行をまたぐようにしてください)。

于 2009-06-18T21:33:36.887 に答える
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)
)
于 2012-05-03T19:05:32.070 に答える