Pergunta

Eu me sinto como um idiota apenas para pedir isso, mas eu não estou recebendo nenhuma ajuda do Google, e eu folheou todos os resultados de SO em uma busca simples para SMO e não vê-lo também.

A versão curta é que eu estou começando a brincar com T4. Eu estou expandindo tutorial inicial Oleg do Sych para fornecer enumeração sobre todas as tabelas para criar um (IMHO um pouco bobo) proc delete. Este é apenas um experimento, pelo que a sua inutilidade absoluta não me incomoda. :)

Meu expansão para olhares tutorial de Oleg assim:

<#@ 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");
    }
#> 

O problema é que há mesas são devolvidos a partir da coleção Tables. Isto é validado pelo comentário SQL contagem de tabela Eu estou gerando, que 0 saídas.

Como escrito, o código acima gera o seguinte:

USE dbname
/* Number of tables: 0 */

No entanto, se eu remover o loop e fornecer manualmente um nome de tabela válido que existe neste banco de dados, ele gera o (novamente bobo) proc -. Para a tabela

As mesas são separados em um esquema, seria que o assunto? Além disso, isso vai contra uma instância SQL2005 - se que, potencialmente, causar problemas

?

Finalmente, eu também estou achando que não posso enumerar sinônimos via a coleção sinônimos. (Eu pensei que eu ia ser inteligente e ir por esse caminho desde as mesas estão em um esquema, mas têm sinônimos definido. Mas ... não dados.)

Mais uma vez, para reiterar, o código acima é, naturalmente, não a produção, nem mesmo a produção digna. Eu só estou tentando aprender tanto T4 e SMO, e atingido um obstáculo tentando fazer algo que eu pensei que seria ridiculamente simples. :)

Foi útil?

Solução

SMO não recupera metadados automaticamente se você simplesmente criar uma nova instância da classe de banco de dados. Recuperando metadados podem demorar um pouco, especialmente em um ambiente frio. Chamada database.Refresh () antes do loop.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top