Domanda

Voglio trovare un comando sql o qualcosa che possa fare questo dove ho una tabella chiamata tblFoo e voglio chiamarla tblFooBar. Tuttavia, voglio che anche la chiave primaria sia il cambiamento, ad esempio attualmente è:

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

E voglio un cambio di nome per cambiarlo in:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

Quindi, ricorsivamente, esegui questa modifica in cascata su tutte le tabelle che hanno una relazione chiave principale, ad es. da questo:

CHECK ADD  CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])

A questo:

 CHECK ADD  CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])

Ovviamente, sto provando a non eseguire tutto questo manualmente perché a) è un processo soggetto a errori eb) non si ridimensiona.

È stato utile?

Soluzione

Questo è appena fuori dalla mia testa e non è completo (dovresti aggiungere un codice simile per gli indici). Inoltre, dovrai aggiungere il codice per evitare di rinominare gli oggetti da una tabella con lo stesso nome di base, ma caratteri aggiuntivi - ad esempio, questo codice elencherebbe anche tblFoo2 e tutti i suoi oggetti associati. Spero che sia un inizio per te.

DECLARE
    @old_name   VARCHAR(100),
    @new_name   VARCHAR(100)

SET @old_name = 'tblFoo'
SET @new_name = 'tblFooBar'

SELECT
    'EXEC sp_rename ''' + name + ''', ''' + REPLACE(name, @old_name, @new_name) + ''''
FROM dbo.sysobjects
WHERE name LIKE '%' + @old_name + '%'

Altri suggerimenti

Buona risposta di Tom
Ho appena esteso la sua query qui per includere gli indici

declare
 @old nvarchar(100),
 @new nvarchar(100)

set @old = 'OldName'
set @new = 'NewName'

select 'EXEC sp_rename ''' + name + ''', ''' + 
  REPLACE(name, @old, @new) + ''''
 from sys.objects 
 where name like '%' + @old + '%'
union -- index renames
select 'EXEC sp_rename ''' + (sys.objects.name + '.' + sys.indexes.name)  +  ''', ''' +
  REPLACE(sys.indexes.name, @old, @new) + ''', ''INDEX'''
  from sys.objects 
   left join sys.indexes on sys.objects.object_id = sys.indexes.object_id
  where sys.indexes.name like '%' + @old + '%'

Un ottimo strumento che elimina il problema della ridenominazione delle tabelle è Red Gate SQL refactoring Troverà automaticamente le tue dipendenze e risolverà tutte quelle cose anche per te.

Grande fan :-)

SQL Server non lo farà direttamente per quanto ne so. Dovresti creare manualmente lo script per apportare la modifica. Ciò può essere ottenuto generando l'SQL per la definizione della tabella (SSMS lo farà) e facendo una ricerca e sostituendo i nomi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top