Criar Instrução SQL de Update usando SMO

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
  • a tabela inclui sempre uma coluna do tipo Timestamp que deve ser devolvido e que se chama lastUpdated
  • a actualização só pode ocorrer se tiver o último timestamp
  • deve ser devolvido o número de linhas afectadas pela operação de Update
  • as colunas CreatedOn, CreatedBy, lastUpdatedOn, lastUpdatedBy existem sempre
  • a função considera a existencia de um array chamado readOnly com uma lista de campos que não devem ser incluídos

Exemplo do resultado pretendido

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" & ControlChars.CrLf & _
                    "SELECT @updatedRows = @@ROWCOUNT;SELECT @lastUpdated = lastUpdated FROM {0}TM_Parametros WHERE id = @Id ;"

 

Código

StringBuilder sqlUpdate = new StringBuilder(50);
sqlUpdate.AppendFormat("UPDATE {{0}}{0} SET ", table.Name);
foreach(Column c in table.Columns)
{
	if (!c.InPrimaryKey &&
		!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());

 

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *