


<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OsMeusApontamentos &#187; smo</title>
	<atom:link href="http://blog.osmeusapontamentos.com/index.php/tag/smo/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.osmeusapontamentos.com</link>
	<description></description>
	<lastBuildDate>Wed, 01 Feb 2012 14:20:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Foreign Keys com SMO #2</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2009/02/13/foreign-keys-com-smo-2/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2009/02/13/foreign-keys-com-smo-2/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 19:32:52 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[smo]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=1260</guid>
		<description><![CDATA[Objectivo: Determinar o nome da tabela que está a ser referenciada a partir de uma chave externa Ferramentas: SQL Server Management Objects (SMO) Principais objectos e propriedades: Table, Table.ForeignKeys, Column, ForeignKey, ForeignKeyColumn Notas: chave primária e foreign key não composta &#160; Código private static string GetReferencedKeyColumnName(Database database, Table table, Column column) { Column c2 = [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Objectivo</strong>: Determinar o nome da tabela que está a ser referenciada a partir de uma chave externa<br />
<strong>Ferramentas</strong>: <a href="http://msdn.microsoft.com/en-us/library/ms162169.aspx">SQL Server Management Objects (SMO)</a><br />
<strong>Principais objectos e propriedades</strong>: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table_members.aspx">Table</a>, Table.ForeignKeys, <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx">Column</a>, <a href="http://msdn.microsoft.com/pt-br/library/microsoft.sqlserver.management.smo.foreignkey_members.aspx">ForeignKey</a>, <a href="http://msdn.microsoft.com/pt-br/library/microsoft.sqlserver.management.smo.foreignkey.columns.aspx">ForeignKeyColumn</a><br />
<strong> Notas:</strong></p>
<ul>
<li> chave primária e foreign key não composta</li>
</ul>
<p>&nbsp;</p>
<p><strong>Código</strong></p>
<div style="overflow:scroll">
<pre lang="csharp">
private static string GetReferencedKeyColumnName(Database database, Table table, Column column)
{
    Column c2 = new Column();
    bool exists = false;
    string referencedKey = "";

    database.Refresh();
    foreach (ForeignKey ffk in table.ForeignKeys)
    {
        foreach (ForeignKeyColumn fc in ffk.Columns)
        {
            c2 = table.Columns[fc.Name];
            if (c2.Equals(column))
            {
                database.Tables[ffk.ReferencedTable].Refresh();
                database.Tables[ffk.ReferencedTable].Indexes.Refresh();

                Index idx =  database.Tables[ffk.ReferencedTable].Indexes[ffk.ReferencedKey];

                if (idx == null) idx =  database.Tables[ffk.ReferencedTable].Indexes["[" + ffk.ReferencedKey + "]"];

                if (idx != null)
                    referencedKey += idx.IndexedColumns[0].Name;

                exists = true;
                break;
            }
        }
        if (exists)
        {
            break; // not considering composite FK
        }
    }
    return referencedKey;
}
</pre>
</div>
<p>&nbsp;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2009/02/13/foreign-keys-com-smo-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Foreign Keys com SMO #1</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2009/02/11/foreign-keys-com-smo-1/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2009/02/11/foreign-keys-com-smo-1/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 19:28:00 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[smo]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=1257</guid>
		<description><![CDATA[Objectivo: Determinar o nome da tabela que está a ser referenciada a partir de uma chave externa Ferramentas: SQL Server Management Objects (SMO) Principais objectos e propriedades: Table, Table.ForeignKeys, Column, ForeignKey, ForeignKeyColumn Notas: chave primária e foreign key não composta &#160; Código private static string GetReferencedTableName(Table table, Column column) { Column c2 = new Column(); [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Objectivo</strong>: Determinar o nome da tabela que está a ser referenciada a partir de uma chave externa<br />
<strong>Ferramentas</strong>: <a href="http://msdn.microsoft.com/en-us/library/ms162169.aspx">SQL Server Management Objects (SMO)</a><br />
<strong>Principais objectos e propriedades</strong>: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table_members.aspx">Table</a>, Table.ForeignKeys, <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx">Column</a>, <a href="http://msdn.microsoft.com/pt-br/library/microsoft.sqlserver.management.smo.foreignkey_members.aspx">ForeignKey</a>, <a href="http://msdn.microsoft.com/pt-br/library/microsoft.sqlserver.management.smo.foreignkey.columns.aspx">ForeignKeyColumn</a><br />
<strong> Notas:</strong></p>
<ul>
<li> chave primária e foreign key não composta</li>
</ul>
<p>&nbsp;</p>
<p><strong>Código</strong></p>
<div style="overflow:scroll">
<pre lang="csharp">
private static string GetReferencedTableName(Table table, Column column)
{
    Column c2 = new Column();
    bool exists = false;
    string referencedTable = "";
    foreach (ForeignKey ffk in table.ForeignKeys)
    {
        foreach (ForeignKeyColumn fc in ffk.Columns)
        {
            c2 = table.Columns[fc.Name];
            if (c2.ID == column.ID)
            {
                exists = true;
                break;
            }
        }
        if (exists)
        {
            referencedTable += ffk.ReferencedTable;
            break; // not considering composite FK
        }
    }
    return referencedTable;
}
</pre>
</div>
<p>&nbsp;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2009/02/11/foreign-keys-com-smo-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criar Instrução SQL de Select usando SMO</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2009/02/09/criar-instrucao-sql-de-select-usando-smo/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2009/02/09/criar-instrucao-sql-de-select-usando-smo/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 19:16:12 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[smo]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=1253</guid>
		<description><![CDATA[Objectivo: criar instrução SQL de Select que devolva todos os campos de uma tabela. Deve também &#8220;descodificar&#8221; as foreign keys de uma tabela enviando para isso um campo não chave da tabela referenciada. Ferramentas: SQL Server Management Objects (SMO) Principais objectos e propriedades: Table, Table.Columns, Column, Column.Identity, Column.InPrimaryKey Notas: chave primária não composta campos foreign [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Objectivo</strong>: criar instrução SQL de Select que devolva todos os campos de uma tabela. Deve também &#8220;descodificar&#8221; as foreign keys de uma tabela enviando para isso um campo não chave da tabela referenciada.<br />
<strong>Ferramentas</strong>: <a href="http://msdn.microsoft.com/en-us/library/ms162169.aspx">SQL Server Management Objects (SMO)</a><br />
<strong>Principais objectos e propriedades</strong>: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table_members.aspx">Table</a>, Table.Columns, <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx">Column</a>, Column.Identity, Column.InPrimaryKey<br />
<strong> Notas:</strong></p>
<ul>
<li> chave primária não composta</li>
<li> campos foreign key podem ser nulos pelo que não podemos optar sempre pelo INNER JOIN</li>
<li> é assumida a existência de uma função chamada GetReferencedTableName() que devolve o nome da tabela que está a ser referencia por uma foreign key.</li>
<li> é assumida a existência de uma função chamada GetReferencedKeyColumnName() que devolve o primeiro campo nao chave de uma tabela referenciada. o nome desse campo aparecerá para fora com o nome da coluna inicial +  o sufixo &#8220;_description&#8221;</li>
<li> os nomes das tabelas referencias são convertidos para aliases do tipo t_(numero) em que numero é um simples contador que assume que a lista de foreign keys vem sempre pela mesma ordem</li>
<li> as colunas CreatedOn, CreatedBy, lastUpdatedOn, lastUpdatedBy existem sempre</li>
</ul>
<p><strong>Exemplo do resultado pretendido</strong></p>
<div style="overflow:scroll">
<pre lang="vbnet">
Dim sql As String = "SELECT {0}TM_Deslocacoes.IdDeslocacao, {0}TM_Deslocacoes.IdColaborador, convert(varchar(500), t_0.Nome) [IdColaborador_description], {0}TM_Deslocacoes.IdMeioDeslocacao, convert(varchar(500), t_1.Nome) [IdMeioDeslocacao_description], {0}TM_Deslocacoes.LocalDestino, convert(varchar(500), t_2.Designacao) [LocalDestino_description], {0}TM_Deslocacoes.DataPartida, {0}TM_Deslocacoes.LocalPartida, convert(varchar(500), t_3.Designacao) [LocalPartida_description], {0}TM_Deslocacoes.DataRegresso, {0}TM_Deslocacoes.Direccao, convert(varchar(500), t_4.Description) [Direccao_description], {0}TM_Deslocacoes.NumeroPessoas, {0}TM_Deslocacoes.Observacoes, {0}TM_Deslocacoes.CreatedOn, {0}TM_Deslocacoes.CreatedBy, {0}TM_Deslocacoes.LastUpdatedOn, {0}TM_Deslocacoes.LastUpdatedBy, {0}TM_Deslocacoes.LastUpdated FROM {0}TM_Deslocacoes INNER JOIN {0}TM_Colaboradores t_0 ON {0}TM_Deslocacoes.IdColaborador = t_0.IdColaborador INNER JOIN {0}TM_DefinicaoMeiosDeslocacaoDisponiveis t_1 ON {0}TM_Deslocacoes.IdMeioDeslocacao = t_1.IdMeioDeslocacaoDisponivel INNER JOIN {0}TM_DefinicaoLocalidades t_2 ON {0}TM_Deslocacoes.LocalDestino = t_2.IdLocalidade  LEFT OUTER JOIN {0}TM_DefinicaoLocalidades t_3 ON {0}TM_Deslocacoes.LocalPartida = t_3.IdLocalidade  INNER JOIN {0}TM_Parametros t_4 ON {0}TM_Deslocacoes.Direccao = t_4.Id       WHERE 	IdDeslocacao = @IdDeslocacao"
</pre>
</div>
<p>&nbsp;</p>
<p><strong>Código</strong></p>
<div style="overflow:scroll">
<pre lang="csharp">
private static string CreateMethodFindAll_SelectStatement(Table table, Database database)
{

    StringBuilder sb = new StringBuilder(200);
    database.Tables.Refresh();
    table.Refresh();

    sb.Append("SELECT ");
    bool primeiro = true;
    int fkCount = 0;

    foreach (Column c in table.Columns)
    {
        if (primeiro) primeiro = false; else sb.Append(", ");
        sb.AppendFormat("{{0}}{0}.{1}", table.Name, c.Name);
        if (c.IsForeignKey)
        {
            string fkt = GetReferencedTableName(table, c);
            if (fkt != "")
            {
                Table fkTable = database.Tables[fkt];
                if (fkTable != null)
                {
                    sb.AppendFormat(", convert(varchar(500), t_{0}.{1}) [{2}_description]", fkCount, GetFirstNonKeyColumnName(fkTable), c.Name);
                    fkCount++;
                }
            }
        }
    }

    return sb.ToString();
}

private static string CreateMethodFindAll_JoinStatement(Table table, Database database)
{
    StringBuilder sb = new StringBuilder(200);

    bool primeiro = true;
    int fkCount = 0;

    fkCount = 0;
    foreach (Column c in table.Columns)
    {
        if (primeiro) primeiro = false; else sb.Append(" ");
        if (c.IsForeignKey)
        {
            string fkt = GetReferencedTableName(table, c);
            if (fkt != "")
            {
                Table fkTable = database.Tables[fkt];
                if (fkTable != null)
                {
                    if (c.Nullable)
                        sb.AppendFormat("LEFT OUTER JOIN {{0}}{2} t_{7} ON {{0}}{4}.{5} = t_{7}.{6}", table.Parent.ToString(), fkTable.Schema, fkTable.Name, table.Schema, table.Name, c.Name, GetReferencedKeyColumnName(database, table, c), fkCount);
                    else
                        sb.AppendFormat("INNER JOIN {{0}}{2} t_{7} ON {{0}}{4}.{5} = t_{7}.{6}", table.Parent.ToString(), fkTable.Schema, fkTable.Name, table.Schema, table.Name, c.Name, GetReferencedKeyColumnName(database, table, c), fkCount);
                    fkCount++;
                }
            }
        }
    }

    return sb.ToString();
}

private static string CreateMethodFindAll_sql(Table table, Database database)
{
    StringBuilder sb = new StringBuilder(200);

    sb.Append(CreateMethodFindAll_SelectStatement(table, database));

    sb.AppendFormat(" FROM {{0}}{0}", table.Name);

    sb.Append(CreateMethodFindAll_JoinStatement(table, database));

    return sb.ToString();
}
</pre>
</div>
<p>&nbsp;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2009/02/09/criar-instrucao-sql-de-select-usando-smo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criar Instrução SQL de Delete usando SMO</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2009/02/05/criar-instrucao-sql-de-delete-usando-smo/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2009/02/05/criar-instrucao-sql-de-delete-usando-smo/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 19:10:07 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[smo]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=1248</guid>
		<description><![CDATA[Objectivo: criar a partir de uma instrução SQL parametrizada para a eliminação de dados numa tabela. Ferramentas: SQL Server Management Objects (SMO) Principais objectos e propriedades: Table, Table.Columns, Column, Column.Identity, Column.InPrimaryKey Notas: chave primária não composta a tabela inclui sempre uma coluna do tipo Timestamp que deve ser devolvido e que se chama lastUpdated a [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Objectivo</strong>: criar a partir de uma instrução SQL parametrizada para a eliminação de dados numa tabela.<br />
<strong>Ferramentas</strong>: <a href="http://msdn.microsoft.com/en-us/library/ms162169.aspx">SQL Server Management Objects (SMO)</a><br />
<strong>Principais objectos e propriedades</strong>: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table_members.aspx">Table</a>, Table.Columns, <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx">Column</a>, Column.Identity, Column.InPrimaryKey<br />
<strong> Notas:</strong></p>
<ul>
<li> chave primária não composta</li>
<li> a tabela inclui sempre uma coluna do tipo <a href="http://msdn.microsoft.com/en-us/library/ms182776.aspx">Timestamp</a> que deve ser devolvido e que se chama lastUpdated</li>
<li> a actualização só pode ocorrer se tiver o último timestamp</li>
<li> deve ser devolvido o número de linhas afectadas pela operação de Delete</li>
<li> as colunas CreatedOn, CreatedBy, lastUpdatedOn, lastUpdatedBy existem sempre</li>
</ul>
<p><strong>Exemplo do resultado pretendido</strong></p>
<div style="overflow:scroll">
<pre lang="vbnet">
Dim sql As String = "DELETE FROM {0}TM_Parametros WHERE Id = @Id AND  lastUpdated = @lastUpdated" &#038; ControlChars.CrLf &#038; _
					"SELECT @updatedRows = @@ROWCOUNT;"
</pre>
</div>
<p>&nbsp;</p>
<p><strong>Código</strong></p>
<div style="overflow:scroll">
<pre lang="csharp">
sb.AppendFormat("        Dim sql As String = \"DELETE FROM {{0}}{0} WHERE ", table.Name);

foreach(Column c in table.Columns)
{
	if (c.InPrimaryKey)
	{
		sb.AppendFormat("{0} = @{0} AND ", UpperCaseFirstCharacter(c.Name));
	}
}

sb.AppendLine(" lastUpdated = @lastUpdated\" &#038; ControlChars.CrLf &#038; _ ");
sb.AppendLine("                            \"SELECT @updatedRows = @@ROWCOUNT;\"");
</pre>
</div>
<p>&nbsp;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2009/02/05/criar-instrucao-sql-de-delete-usando-smo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criar Instrução SQL de Update usando SMO</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2009/02/03/criar-instrucao-sql-de-update-usando-smo/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2009/02/03/criar-instrucao-sql-de-update-usando-smo/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 19:04:33 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[smo]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=1243</guid>
		<description><![CDATA[Objectivo: criar a partir de uma instrução SQL parametrizada para a actualização de dados numa tabela. Ferramentas: SQL Server Management Objects (SMO) Principais objectos e propriedades: Table, Table.Columns, Column, Column.InPrimaryKey Notas: chave primária não composta mesmo que chave primária não seja um valor automatico (por exemplo ter a propriedade identity) ela nunca mais é actualizada [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Objectivo</strong>: criar a partir de uma instrução SQL parametrizada para a actualização de dados numa tabela.<br />
<strong>Ferramentas</strong>: <a href="http://msdn.microsoft.com/en-us/library/ms162169.aspx">SQL Server Management Objects (SMO)</a><br />
<strong>Principais objectos e propriedades</strong>: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table_members.aspx">Table</a>, Table.Columns, <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx">Column</a>, Column.InPrimaryKey<br />
<strong> Notas:</strong></p>
<ul>
<li> chave primária não composta</li>
<li> mesmo que chave primária não seja um valor automatico (por exemplo ter a propriedade identity) ela nunca mais é actualizada</li>
<li> a tabela inclui sempre uma coluna do tipo <a href="http://msdn.microsoft.com/en-us/library/ms182776.aspx">Timestamp</a> que deve ser devolvido e que se chama lastUpdated</li>
<li> a actualização só pode ocorrer se tiver o último timestamp</li>
<li> deve ser devolvido o número de linhas afectadas pela operação de Update</li>
<li> as colunas CreatedOn, CreatedBy, lastUpdatedOn, lastUpdatedBy existem sempre</li>
<li> a função considera a existencia de um array chamado readOnly com uma lista de campos que não devem ser incluídos</li>
</ul>
<p><strong>Exemplo do resultado pretendido</strong></p>
<div style="overflow:scroll">
<pre lang="vbnet">
Dim sql As String = "UPDATE {0}TM_Parametros SET description = @Description, scope = @Scope, sorting = @Sorting, visible = @Visible, lastUpdatedOn = @LastUpdatedOn, lastUpdatedBy = @LastUpdatedBy WHERE id = @Id AND lastUpdated = @lastUpdated" &#038; ControlChars.CrLf &#038; _
                    "SELECT @updatedRows = @@ROWCOUNT;SELECT @lastUpdated = lastUpdated FROM {0}TM_Parametros WHERE id = @Id ;"
</pre>
</div>
<p>&nbsp;</p>
<p><strong>Código</strong></p>
<div style="overflow:scroll">
<pre lang="csharp">
StringBuilder sqlUpdate = new StringBuilder(50);
sqlUpdate.AppendFormat("UPDATE {{0}}{0} SET ", table.Name);
foreach(Column c in table.Columns)
{
	if (!c.InPrimaryKey &#038;&#038;
		!readOnly.Contains(c.Name) )
		sqlUpdate.AppendFormat("{0} = @{1}, ", LowerCaseFirstCharacter(c.Name), UpperCaseFirstCharacter(c.Name));
}
sqlUpdate.Append("lastUpdatedOn = @LastUpdatedOn, lastUpdatedBy = @LastUpdatedBy WHERE ");
foreach(Column c in table.Columns)
{
	if (c.InPrimaryKey)
		sqlUpdate.AppendFormat("{0} = @{1} AND ", LowerCaseFirstCharacter(c.Name), UpperCaseFirstCharacter(c.Name));
}
sqlUpdate.Append("lastUpdated = @lastUpdated");

StringBuilder sqlSelect = new StringBuilder(50);
bool primeiro = true;
foreach(Column c in table.Columns)
{
	if (c.InPrimaryKey)
	{
		if (primeiro) primeiro = false; else sqlSelect.Append(" AND ");
		sqlSelect.AppendFormat("{0} = @{1} ", LowerCaseFirstCharacter(c.Name), UpperCaseFirstCharacter(c.Name));
	}
}
String sql = String.Format("SELECT @updatedRows = @@ROWCOUNT;SELECT @lastUpdated = lastUpdated FROM {{0}}{0} WHERE {1};", table.Name, sqlSelect.ToString());
</pre>
</div>
<p>&nbsp;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2009/02/03/criar-instrucao-sql-de-update-usando-smo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

