在 SQL Server 中,我有一个数据库abc
。在这个数据库中,我有数百个表。这些表中的每一个都称为xyz.table
我想更改所有要调用的表abc.table
。
我们有办法将数据库中的所有名称从更改为xyz.table
更改abc.table
吗abc
?
我可以通过将每个表的架构更改为 abc 来手动更改名称
在 SQL Server 中,我有一个数据库abc
。在这个数据库中,我有数百个表。这些表中的每一个都称为xyz.table
我想更改所有要调用的表abc.table
。
我们有办法将数据库中的所有名称从更改为xyz.table
更改abc.table
吗abc
?
我可以通过将每个表的架构更改为 abc 来手动更改名称
您可以让游标在xyz
架构中的所有表上运行,并将所有这些表移动到abc
架构中:
DECLARE TableCursor CURSOR FAST_FORWARD
FOR
-- get the table names for all tables in the 'xyz' schema
SELECT t.Name
FROM sys.tables t
WHERE schema_id = SCHEMA_ID('xyz')
DECLARE @TableName sysname
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
-- iterate over all tables found
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Stmt NVARCHAR(999)
-- construct T-SQL statement to move table to 'abc' schema
SET @Stmt = 'ALTER SCHEMA abc TRANSFER xyz.' + @TableName
EXEC (@Stmt)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
您可以将 Alter Schema 与未记录的存储过程 exec sp_MSforeachtable 一起使用,它基本上遍历所有表。
exec sp_MSforeachtable "ALTER SCHEMA new_schema TRANSFER ? PRINT '? modified' "
用新的 Schema 更改 new_schema 关键字。
详情请通过链接
正如其他人指出的那样,SP 已被弃用,因此还有另一种方法可以通过从 sys.tables 获取表的名称来做到这一点
Declare @value int
Set @value=1
declare @sql varchar(max), @table varchar(50), @old varchar(50), @new varchar(50)
set @old = 'dbo'
set @new = 'abc'
while exists(select * from sys.tables where schema_name(schema_id) = @old)
begin
;With CTE as
(
Select *,row_number() over(order by object_id) rowNumber from sys.tables
where schema_name(schema_id) = @old
)
select @table= name from CTE where @value=rowNumber
Set @value=@value+1
set @sql = 'alter schema ' + @new + ' transfer ' + @old + '.' + @table
exec(@sql)
end
在不使用未记录/不受支持sp_MSforeachtable
的过程的情况下,这里有一种简洁的方法来为给定模式上的每个表选择和/或运行所有必要的 ALTER 语句:
declare @oldSchema nvarchar(50) = 'abc' -- usually 'dbo'
declare @newSchema nvarchar(50) = 'xyz' -- use your new schema name
declare @sql nvarchar(max) =
(select
(select N'alter schema [' + @newSchema + '] transfer [' + @oldSchema + '].[' + name + ']
' as 'data()'
from sys.tables
where schema_name(schema_id) = @oldSchema for xml path(''), type)
.value('text()[1]','nvarchar(max)'))
-- You can select out the results for scrutiny
select @sql
-- Or you can execute the results directly
exec (@sql)
这避免了使用游标,并使用方括号来转义可能与 SQL 关键字冲突的表名。
我假设您已经abc
在数据库中创建了模式。
如果没有你可以参考这里
http://www.youtube.com/watch?v=_DDgv8uek6M
http://www.quackit.com/sql_server/sql_server_2008/tutorial/sql_server_database_schemas.cfm
要更改数据库中所有表的架构,您可以使用以下系统创建的 msforeachtable存储过程来使用alter schema重命名每个表的架构。
exec sp_MSforeachtable "ALTER SCHEMA abc TRANSFER ? PRINT '? modified' "