Question

I want to find a sql command or something that can do this where I have a table named tblFoo and I want to name it tblFooBar. However, I want the primary key to also be change, for example, currently it is:

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

And I want a name change to change it to:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

Then, recursively go through and cascade this change on all tables that have a foreigh key relationship, eg. from this:

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

To this:

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

Naturally, I am trying not to go through and do this all manually because a) it is an error prone process, and b)it doesn't scale.

Was it helpful?

Solution

This is just off the top of my head and isn't complete (you'd need to add similar code for indexes). Also, you would need to either add code to avoid renaming objects from a table with the same base name, but additional characters - for example, this code would also list tblFoo2 and all of its associated objects. Hopefully it's a start for you though.

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 + '%'

OTHER TIPS

Good answer by Tom
I've just extended his query here to include indexes

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 + '%'

A great tool that takes the pain out of renaming tables is Red Gate SQL Refactor It will automatically find your dependency's and work all that stuff out for you too.

Big fan :-)

SQL Server won't do this directly as far as I am aware. You would have to manually build the script to do the change. This can be achieved by generating the SQL for the table definition (SSMS will do this) and doing a search and replace on the names.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top