16

我正在尝试做的事情:使用 C# 创建一个 SQL 脚本来创建现有表的精确副本。

我的问题:您将如何定义 scriptingOptions 中的选项以确保生成的脚本将创建 100% 精确的表副本?有 78 个选项,目前尚不清楚如何执行此操作。最初,我认为通过在不传递任何 ScriptingOptions 的情况下调用 table.Script() 可以获得我的表的精确副本,但这并不能解决问题(例如,除非在中指定索引,否则不会对索引进行编码脚本选项)。看来我实际上必须手动指定 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();
4

2 回答 2

21

您要设置以下内容。

  1. ClusteredIndexes = true
  2. 默认 = 真
  3. 全文索引 = 真
  4. 索引 = 真
  5. NonClusteredIndexes = true
  6. SchemaQualify = true (如果您想将其编写到当前架构中)
  7. ScriptData = true (如果要复制数据)
  8. ScriptDrops = true (这将在重新创建之前删除目标数据库中的表)
  9. ScriptSchema = true (如果您想将其编写到当前架构中)
  10. 统计 = 真
  11. 触发器 = 真
  12. WithDependencies = true (如果你想编写依赖对象的脚本)
  13. DriAll = true (脚本引用完整性操作,例如如果父表键不存在则不允许插入子表)
于 2012-07-31T15:27:22.337 回答
0

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

于 2012-08-05T11:12:50.333 回答