Я чувствую себя как придурок только из-за того, что спрашиваю об этом, но я не получаю никакой помощи от Google, и я просмотрел все результаты SO по простому поиску SMO и тоже не видел.
Короче говоря, я начинаю играть с Т4. Я расширяю начальное руководство Олега Сыча , чтобы обеспечить перечисление всех таблиц для создания (ИМХО довольно глупого) процесса удаления. Это всего лишь эксперимент, поэтому его полная бесполезность меня не беспокоит. :)
Мое дополнение к учебнику Олега выглядит так:
<#@ template language="C#" hostspecific="true" #>
<#@ output extension="SQL" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ include file="T4Toolbox.tt" #>
<#
// Config variables
string serverName = "dbserver\\dbinstance";
string dbName = "dbname";
#>
USE <#= dbName #>
<#
// Iterate over tables and generate procs
Server server = new Server(serverName);
Database database = new Database(server, dbName);
WriteLine("/* Number of tables: " + database.Tables.Count.ToString() + " */");
foreach (Table table in database.Tables)
{
table.Refresh();
#>
CREATE PROCEDURE <#= table.Name #>_Delete
<#
PushIndent(" ");
foreach (Column column in table.Columns)
{
if (column.InPrimaryKey)
WriteLine("@" + column.Name + " " + column.DataType.Name);
}
PopIndent();
#>
AS
DELETE FROM
<#= table.Name #>
WHERE
<#
PushIndent(" ");
foreach (Column column in table.Columns)
{
if (column.InPrimaryKey)
WriteLine(column.Name + " = @" + column.Name);
}
PopIndent();
WriteLine("GO");
}
#>
Проблема в том, что из коллекции Tables
не возвращаются таблицы. Это подтверждается сгенерированным мной комментарием к количеству таблиц, который выдает 0
.
Как написано, код выше генерирует следующее:
USE dbname
/* Number of tables: 0 */
Однако, если я удаляю цикл for и вручную предоставляю допустимое имя таблицы, которое существует в этой базе данных, он генерирует (опять же глупый) proc - для этой таблицы.
Таблицы разделены на схемы, это имеет значение? Кроме того, это идет против экземпляра SQL2005 - это может вызвать проблемы?
Наконец, я также обнаружил, что не могу перечислить синонимы через коллекцию синонимов. (Я думал, что буду умным и пойду по этому пути, поскольку таблицы в схеме, но с определенными синонимами. Но ... без кубиков.)
Опять же, повторюсь, приведенный выше код, естественно, не является ни производственным, ни даже достойным производства. Я просто пытаюсь выучить и Т4, и СМО, и попадаю в контрольно-пропускной пункт, пытаясь сделать что-то, что, как я думал, было бы смехотворно простым. :)