Excluir e criar várias colunas SQL usando Regex

Recentemente, tive a tarefa de mover um grande número de colunas de uma tabela para outra e, como não estou interessado em escrever linha após linha de SQL, gerei algumas com um pouco de regex. Aqui está um script C # que montei no LINQPad para fazer a substituição (mas você poderia fazê-lo facilmente no bloco de notas).

void Main()
{
string sourceTable = "Table1";
string sourceTableFK = "Table2Id";
string targetTable = "Table2";
string targetTablePK = "Id";

Dictionary<string, string> columns = new Dictionary<string, string> {
{ "ColumnA", @"NVARCHAR(255)"},
{ "ColumnB", @"DATETIME"},
{ "ColumnC", @"INT"}
};

string addReplace = "IF NOT EXISTS (SELECT * FROM SYS.COLUMNS WHERE Name = '$1' AND object_id = (SELECT object_id FROM sys.objects WHERE Name = '" + targetTable + "'))rnBEGINrntALTER TABLE " + targetTable + "rntADDt$1 $2rnENDrnGO";

string migrateReplace = "IF EXISTS (SELECT * FROM SYS.COLUMNS WHERE Name = '$1' AND object_id = (SELECT object_id FROM sys.objects WHERE Name = '" + sourceTable + "'))rnBEGINrntUPDATE "+ targetTable + "rntSETt$1 = (SELECT $1 FROM " + sourceTable + " WHERE " + sourceTableFK + " = " + targetTable + "." + targetTablePK + ")rnENDrnGO";

string dropReplace = "IF EXISTS (SELECT * FROM SYS.COLUMNS WHERE Name = '$1' AND object_id = (SELECT object_id FROM sys.objects WHERE Name = '" + sourceTable + "'))rnBEGINrntALTER TABLE " + sourceTable + "rntDROP COLUMN $1rnENDrnGO";

foreach (var column in columns)
{
Regex.Replace(string.Format("{0}|{1}", column.Key, column.Value), @"^([^|]*)|([^|]*)$", addReplace).Dump();
Regex.Replace(column.Key, @"^([a-zA-Z0-9]*)$", migrateReplace).Dump();
// handle constraints here
Regex.Replace(column.Key, @"^([a-zA-Z0-9]*)$", dropReplace).Dump();
}
}

O SQL gerado irá:

  1. Crie a nova coluna na Tabela B
  2. Copie os dados da TabelaA para a TabelaB com base na relação TabelaA.TableBId = TableB.Id
  3. Solte a coluna na Tabela A

Observe que isso não faz nada com as restrições, então você pode precisar lidar com elas sozinho

Fique à vontade para usar, compartilhar, alterar e criticar.