2012-06-03 19 views
6

Microsoft.SqlServer.Management.Smoオブジェクトを使用してデータベーススキーマをエクスポートする簡単なユーティリティをC#で構築しました。フルテキストインデックスを追加するまで、これは大きな成果を上げています。Microsoft.SqlServer.Management.Smoを使用してSQLスキーマをプログラムでエクスポートする方法

フルテキストインデックスを作成するためにSQLをエクスポートすると、インデックスに定義されている列は含まれません。たとえば、 "Recipe"という名前のテーブルがあり、 "RecipeName" "Description"という名前のFTインデックスに2つの列が含まれているとします。私のユーティリティを使用してスキーマをダンプすると、次のSQLが生成されます。

CREATE FULLTEXT INDEX ON [dbo].[Recipes] 
KEY INDEX [PK_Recipes]ON ([ft], FILEGROUP [PRIMARY]) 
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM) 

私がダンプされることを期待する何(列に気づく)これです:

CREATE FULLTEXT INDEX ON [dbo].[Recipes](
    [Description] LANGUAGE [English], 
    [RecipeName] LANGUAGE [English] 
) 
KEY INDEX [PK_Recipes]ON ([ft], FILEGROUP [PRIMARY]) 
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM) 

ここでは、データベースファイルからスキーマを生成するC#があります:

static void GenerateScript(string sourceDbPath, string destinationScriptPath) 
{ 
    try 
    { 
     string   connString = string.Format(@"Data Source=.;AttachDbFilename={0};Integrated Security=True;User Instance=True", sourceDbPath); 
     SqlConnection  sqlConn = new SqlConnection(connString); 
     ServerConnection serverConn = new ServerConnection(sqlConn); 
     Server    server = new Server(serverConn);    
     Database   database = server.Databases[sourceDbPath]; 
     Transfer   transfer = new Transfer(database); 
     ScriptingOptions options = new ScriptingOptions(); 

     options.AppendToFile = false;  // Overwrite file 
     options.ClusteredIndexes = true; 
     options.Indexes = true; 
     options.DriAll = true; 
     options.Triggers = true; 
     options.Bindings = true; 
     options.Default = true; 
     options.IncludeDatabaseContext = false; 
     options.IncludeHeaders = true; 
     options.FullTextIndexes = true; 

     options.SchemaQualify = true; 
     options.SchemaQualifyForeignKeysReferences = true; 
     options.ScriptSchema = true; 
     options.ScriptData = false; 
     options.ScriptDrops = false; 

     options.FileName = destinationScriptPath; 
     transfer.Options = options; 
     transfer.CopyAllFullTextCatalogs = true; 
     transfer.CopyAllFullTextStopLists = true; 
     transfer.CopyAllTables = true; 

     transfer.ScriptTransfer(); 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
     Environment.Exit(-1); 
    } 
} 

誰かが私に欠けているものを見つけることができますか?

+0

列を別々にスクリプトする必要がありますか?あなたはする必要はありません。 http://technet.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.fulltextindexcolumn.script(v=sql.100).aspx –

+0

ちょっと、どこにでもあなたのコードをオープンソース化しましたか?私は似たようなことに興味があります。 – Gili

+0

いいえ、申し訳ありません。私はこのコードのソースをオープンできません。 – BitsEvolved

答えて

0

フルテキストインデックス作成ステートメントの列を含むスクリプトオプションの組み合わせが見つかりませんでした。

代わりにsp_help_fulltext_tablessp_help_fulltext_columnsストアドプロシージャを実行して、フルテキストインデックス情報のデータベースを照会しました。これにより私は手で文章を作成することができました。

理想的ではありませんが、機能します。

関連する問題