如何设置SMO ScriptingOptions以保证表的精确副本?

时间:2012-07-25 20:32:50

标签: c# sql smo

我正在尝试做什么:使用C#创建一个SQL脚本来创建现有表的完全副本。

我的问题:您如何定义scriptingOptions中的选项以确保生成的脚本能够创建表的100%精确副本?有78个选项,目前尚不清楚如何做到这一点。最初,我想通过调用table.Script()而不传递任何ScriptingOptions,我将能够获得我的表的精确副本,但这不能解决问题(例如,索引不会被编码,除非它们在脚本选项)。看来我实际上必须手动指定ScriptingOptions中的每个属性才能得到我想要的东西。我设置了哪些来获得我想要的结果?完全复制表格并不难。

可用的脚本选项:以下是所有可用选项:http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.scriptingoptions_properties.aspx

我的代码:

Server server = new Server("XXX");
Database database = new Database();
database = server.Databases["YYY"];
Table table = database.Tables["ZZZ", @"PPP"];

ScriptingOptions scriptingOptions = new ScriptingOptions();

//Define properties in scriptingOptions 

StringCollection result = table.Script(scriptingOptions);

var script = "";
foreach (var line in result) {
    script += line;
}

System.IO.StreamWriter fs = System.IO.File.CreateText(@"QQQ");
fs.Write(script);
fs.Close();

2 个答案:

答案 0 :(得分:17)

您想要设置以下内容。

  1. ClusteredIndexes = true
  2. 默认= true
  3. FullTextIndexes = true
  4. Indexes = true
  5. NonClusteredIndexes = true
  6. SchemaQualify = true (如果您想将其编入当前架构中)
  7. ScriptData = true (如果您要复制数据)
  8. ScriptDrops = true (在重新创建之前,这将在目标数据库中删除表格)
  9. ScriptSchema = true (如果您想将其编入当前架构中)
  10. Statistics = true
  11. Triggers = true
  12. WithDependencies = true (如果您想编写依赖对象的脚本)
  13. DriAll = true (脚本引用完整性操作,例如,如果父表键不存在则不允许INSERT进入子表)

答案 1 :(得分:0)

我使用过smo,错误就是你必须这样做 - 考虑所有数据库对象之间的关系。在编写表脚本时,您必须编写所有安全对象的脚本,外键,扩展属性等。 - 由于关系,确定脚本对象的正确顺序 至于我,确保您拥有相同数据库对象的最佳方法是使用数据库备份。