2008-10-10 63 views
5

我想找到一个sql命令或其他可以做到这一点的地方,我有一个名为tblFoo的表,我想将其命名为tblFooBar。不过,我想主键也可以改变,例如,目前它是:重命名表SQL Server,通过PK和FK的级联该更改

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

而且我想更改名称将其改为:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

然后,递归遍历并在具有外键关系的所有表上级联这种改变,例如。从这样的:

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

要这样:

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

当然,我试图不经过和所有手动做到这一点,因为)它是一个容易出错的过程,和b)没有关系”吨秤。

回答

7

这只是我的头顶,并不完整(你需要添加类似的索引代码)。此外,您需要添加代码以避免从具有相同基本名称的表中重命名对象,但需要添加其他字符 - 例如,此代码还会列出tblFoo2及其所有关联对象。希望这对你来说是一个开始。

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

据我所知,SQL Server不会直接执行此操作。您将不得不手动构建脚本来完成更改。这可以通过为表定义生成SQL(SSMS将执行此操作)并执行搜索并替换名称来实现。

3

一个伟大的工具,它的痛苦了重命名表是Red Gate SQL Refactor 它会自动找到你的依赖性的工作和所有的东西为你了。

大风扇:-)由汤姆

5

很好的回答我只是延长他在这里查询到包括指标

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