Вопрос

Я чувствую себя как придурок только потому, что спрашиваю об этом, но я не получаю никакой помощи от Google, и я пролистал все результаты SO по простому поиску SMO и тоже не увидел его.

Короткая версия - я начинаю играть с T4. Я расширяю начальное руководство Олега Сыча для обеспечения перечисления по всем таблицам для создания (ИМХО довольно глупого) процесса удаления. Это всего лишь эксперимент, поэтому его полная бесполезность меня не беспокоит. :)

Мое дополнение к учебнику Олега выглядит следующим образом:

<#@ 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 не возвращаются никакие таблицы. Это подтверждается генерируемым комментарием SQL для подсчета таблиц, который выводит 0 .

Как написано, код выше генерирует следующее:

USE dbname
/* Number of tables: 0 */

Однако, если я удаляю цикл for и вручную предоставляю правильное имя таблицы, которое существует в этой базе данных, он генерирует (опять же глупый) процесс - для этой таблицы.

Таблицы разделены на схему, будет ли это иметь значение? Кроме того, это идет против экземпляра SQL2005 - это может вызвать проблемы?

Наконец, я также обнаружил, что не могу перечислить синонимы через коллекцию синонимов. (Я думал, что буду умным и пойду по этому пути, поскольку таблицы находятся в схеме, но с определенными синонимами. Но ... без кубиков.)

Опять же, повторюсь, приведенный выше код, естественно, не является ни производственным, ни даже достойным производства. Я просто пытаюсь выучить и Т4, и СМО, и попадаю в контрольно-пропускной пункт, пытаясь сделать что-то, что, как я думал, было бы смехотворно простым. :)

Это было полезно?

Решение

SMO не получает метаданные автоматически, если вы просто создаете новый экземпляр класса Database. Получение метаданных может занять некоторое время, особенно в холодных условиях. Вызовите database.Refresh () перед циклом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top