我正在尝试为我正在使用的本地数据库创建数据库脚本编写器工具。
我已经能够为表,主键,索引和外键生成创建脚本,但我找不到任何方法来为表默认值生成创建脚本。
对于索引,它就像
一样简单foreach (Index index in table.Indexes)
{
ScriptingOptions drop = new ScriptingOptions();
drop.ScriptDrops = true;
drop.IncludeIfNotExists = true;
foreach (string dropstring in index.Script(drop))
{
createScript.Append(dropstring);
}
ScriptingOptions create = new ScriptingOptions();
create.IncludeIfNotExists = true;
foreach (string createstring in index.Script(create))
{
createScript.Append(createstring);
}
}
但Table对象没有Defaults属性。是否有其他方法为表默认值生成脚本?
答案 0 :(得分:5)
尝试使用设置了DriAll选项的Scripter对象:
Server server = new Server(@".\SQLEXPRESS");
Database db = server.Databases["AdventureWorks"];
List<Urn> list = new List<Urn>();
DataTable dataTable = db.EnumObjects(DatabaseObjectTypes.Table);
foreach (DataRow row in dataTable.Rows)
{
list.Add(new Urn((string)row["Urn"]));
}
Scripter scripter = new Scripter();
scripter.Server = server;
scripter.Options.IncludeHeaders = true;
scripter.Options.SchemaQualify = true;
scripter.Options.SchemaQualifyForeignKeysReferences = true;
scripter.Options.NoCollation = true;
scripter.Options.DriAllConstraints = true;
scripter.Options.DriAll = true;
scripter.Options.DriAllKeys = true;
scripter.Options.DriIndexes = true;
scripter.Options.ClusteredIndexes = true;
scripter.Options.NonClusteredIndexes = true;
scripter.Options.ToFileOnly = true;
scripter.Options.FileName = @"C:\tables.sql";
scripter.Script(list.ToArray());
答案 1 :(得分:1)
虽然我没有使用SMO,但我查找了MSDN,这是我找到的。
Table有一个Columns属性(列集合),它应该引用每一列。
每个列都有一个DefaultConstraint属性。
这是你在找什么?
答案 2 :(得分:0)
除了Pavel的回答。
我只需要为一个invidual表获取脚本。 1.我想将表模式名称和表名作为参数传递并生成脚本。 2.将脚本分配给变量而不是写入文件。
单个表的代码:
/*get a particular table script only*/
Table myTable = db.Tables["TableName", "SchemaName"];
scripter.Script(new Urn[] { myTable.Urn});
将脚本写入变量:
StringCollection sc = scripter.Script(new Urn[] { myTable.Urn });
foreach (string script in sc)
{
sb.AppendLine();
sb.AppendLine("--create table");
sb.Append(script + ";");
}
我希望它能帮助未来的读者。