在 SQL Server 2005 中,我希望使用通配符重命名很多表,例如,表名是:
OrderItem
OrderItems
OrderItemss
我希望将它们重命名为:
OrderItem2
OrderItems2
OrderItemss2
这可以使用通配符来完成,所以我不必指定完整的表名吗?谢谢。
在 SQL Server 2005 中,我希望使用通配符重命名很多表,例如,表名是:
OrderItem
OrderItems
OrderItemss
我希望将它们重命名为:
OrderItem2
OrderItems2
OrderItemss2
这可以使用通配符来完成,所以我不必指定完整的表名吗?谢谢。
您可以使用系统表来选择与您的模式匹配的所有表名,例如'OrderItem%',或更复杂的。然后使用动态 sql 使用exec SP_RENAME 'old_name' 'new_name'
.
但是,这不会对查询表的存储过程生效。重命名完成后,需要重新编译这些存储过程。
解决方案 Sql
好的,这是完整的代码。它基于表名以“OrderItem”开头,并且它们都应具有后缀“2”的原始名称。在重命名它们之前,我创建了一个表变量来保存找到的表。如果您“取消注释” select 语句并且只执行该语句,您可以看到选择要重命名的表,以及它们将重命名的表。请注意,我只从 dbo 模式中选择表。
declare @OldTableName nvarchar(max)
declare @NewTableName nvarchar(max)
declare @SqlStmt nvarchar(max)
declare @Tables table
(
OldTableName nvarchar(max),
NewTableName nvarchar(max)
)
insert into @Tables (OldTableName, NewTableName)
select
name as OldTableName ,
name + '2' as NewTableName
from sys.tables
where name like 'OrderItem%'
and schema_id = SCHEMA_ID('dbo')
-- select * from @Tables
declare cur cursor for
select OldTableName,
NewTableName
from @Tables
open cur
while (1=1)
begin
fetch next from cur into @OldTableName, @NewTableName
if @@FETCH_STATUS <> 0
break
set @SqlStmt = N'sp_rename ''' + @OldTableName + ''', ''' + @NewTableName + ''''
exec sp_executesql @SqlStmt
end
close cur
deallocate cur
新 2013 年 4 月 24 日
包含架构名称且不仅在dbo
架构中查找的 Select 语句
select
s.name + '.' + t.name as OldTableName,
t.name + '2' as NewTableName
from sys.tables as t
inner join sys.schemas as s on t.schema_id = s.schema_id
where t.name like 'OrderItem%'
添加
查找sys.tables
所有表(请记住仅选择要重命名的架构中的那些)。将名称连同您给它们的新表名称一起插入到临时表中,然后遍历它们中的每一个,通过调用生成一个 sql 字符串,sp_rename
并使用exec sp_executesql 'SQL STMT'
来进行实际执行。
就是这么简单:
DECLARE @SQL nvarchar(max);
SELECT
@SQL = Coalesce(@SQL + Char(13) + Char(10), '') + 'EXEC sp_rename '''
+ Replace(QuoteName(TABLE_SCHEMA) + '.' + QuoteName(TABLE_NAME), '''', '''''')
+ ''', ''' + Replace(TABLE_NAME + '2', '''', '''''') + ''';'
FROM INFORMATION_SCHEMA.TABLES T
WHERE
T.TABLE_TYPE = 'BASE TABLE'
AND T.TABLE_NAME LIKE 'OrderItem%'
;
EXEC (@SQL);
您可以通过以下查询获取所有用户表的列表,这些表按您需要的内容过滤:
select name from sysobjects where type = 'U' and name like 'user%'
然后使用sp_executesql
和游标对查询结果执行动态 SQL ( MSDN ) 以执行实际重命名。
希望有帮助。
首先在你的数据库中找到表的数量(我有3个)并将这段代码放在一个存储过程中,它也可以放参数!!
`alter procedure [dbo].[changetableName]
as
declare @sql varchar(8000), @table varchar(1000), @oldTable varchar(1000),
@newTable
varchar(1000);
declare @Inc integer;
set @Inc=1;
set @oldTable = '%OrderItem%'
set @newTable = 'OrderItem_n'
while exists(SELECT object_id, t.name AS table_name FROM sys.tables AS t where
t.name Like @oldTable) and (@Inc<=3)
begin
select @table = name from sys.tables
where object_id in(select object_id from sys.tables as t where t.name like
@oldTable )
set @sql = 'sp_rename ' + @table + ' , ' + @newTable + CONVERT(varchar(2),@Inc)
exec(@sql)
SET @Inc = @Inc + 1;
select @sql
end`