Использование SMO для получения скрипта создания таблиц по умолчанию - PullRequest
4 голосов
/ 08 ноября 2008

Я пытаюсь создать инструмент сценария базы данных для локальной базы данных, которую я использую.

Мне удалось сгенерировать сценарии создания для таблиц, первичных ключей, индексов и внешних ключей, но я не могу найти способ создания сценариев создания для значений по умолчанию для таблицы.

Для индексов это так же просто, как

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. Есть ли какой-нибудь другой способ создания сценариев для таблиц по умолчанию?

Ответы [ 3 ]

5 голосов
/ 08 ноября 2008

Попробуйте использовать Scripter объект с установленным параметром DriAll:

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 голос
/ 08 ноября 2008

Хотя я не использовал SMO, я посмотрел MSDN, и вот что я нашел.

Таблица имеет свойство Columns (коллекция столбцов), которое должно иметь ссылку на каждый столбец.
Каждый столбец будет иметь свойство DefaultConstraint.

Это то, что вы ищете?

0 голосов
/ 20 июля 2017

Дополнение к ответу Павла.

Мне нужно было получить скрипт только для отдельной таблицы. 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 + ";");
}

Надеюсь, это поможет будущим читателям.

...