使用SMO获取表默认值的创建脚本

本文关键字:创建 脚本 默认值 SMO 获取 使用 | 更新日期: 2023-09-27 17:48:50

我正在尝试为正在使用的本地数据库创建一个数据库脚本工具。

我已经能够为表、主键、索引和外键生成创建脚本,但我找不到任何方法为表默认值生成创建脚本。

对于索引,它和一样简单

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属性。是否有其他方法可以为表默认值生成脚本?

使用SMO获取表默认值的创建脚本

尝试使用带有DryAll选项集的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());

虽然我还没有使用SMO,但我查找了MSDN,以下是我的发现。

表具有Columns属性(列集合),该属性应具有对每一列的引用
每个列都有一个DefaultConstraint属性。

这就是你要找的吗?

添加到Pavel的答案中

我只需要获取一个不可见表的脚本。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 + ";");
}

我希望它能帮助未来的读者。