Contexto: Algumas de nossas restrições de coluna padrão foram geradas sem nomes explícitos, portanto, obtemos nomes divertidos que variam de servidor para servidor, como:DF__User__TimeZoneIn__5C4D869D
Eu preferiria que todos eles fossem gerenciáveis com uma nomenclatura consistente DF_Users_TimeZoneInfo
, para que possamos garantir que as restrições apropriadas existam em futuras tabelas de destino (como na comparação do RedGate ou mesmo apenas visualmente)
Eu tenho um script que funciona principalmente para o que eu quero:
select 'sp_rename N''[' + s.name + '].[' + d.name + ']'',
N''[DF_' + t.name + '_' + c.name + ']'', ''OBJECT'';'
from sys.tables t
join
sys.default_constraints d
on d.parent_object_id = t.object_id
join
sys.columns c
on c.object_id = t.object_id
and c.column_id = d.parent_column_id
join sys.schemas s
on t.schema_id = s.schema_id
WHERE d.NAME like 'DF[_][_]%'
Mas isso apenas me dá um conjunto de resultados, e não algo que eu possa realmente passar para um executivo ou algo assim.
Como posso fazer isso para executar esses sp_rename
scripts sem ter que recorrer a copiar todos os elementos retornados e colá-los em uma nova janela de consulta e executá-los novamente? Tentando salvar o máximo possível de pressionamentos de tecla para que eu possa corrigir isso em muitos ambientes.
Ok, algumas coisas.
EXEC
ao executar procedimentos armazenados; a taquigrafia semEXEC
só funciona quando é a primeira instrução do lote (e não será o caso aqui).QUOTENAME()
em vez de aplicar colchetes manualmente. Nesse caso, você provavelmente está seguro, mas há casos em que a abordagem manual falhará.você pode testar a
PRINT
saída, mas ela não estará necessariamente completa se seu comando total for > 8k (consulte esta dica para algumas abordagens alternativas ).Com base na sua pergunta .. que você removeu "automatizar o mesmo script em alguns dos bancos de dados da instância"
Abaixo está o código que irá ajudá-lo