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
文書化されていないストアドプロシージャexecsp_MSforeachtableでAlterSchemaを使用できます。これは、基本的にすべてのテーブルを反復処理します。
exec sp_MSforeachtable "ALTER SCHEMA new_schema TRANSFER ? PRINT '? modified' "
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
あなたはすでにabc
データベースにスキーマを作成していると思います。
そうでない場合は、ここを参照できます
http://www.youtube.com/watch?v=_DDgv8uek6M
http://www.quackit.com/sql_server/sql_server_2008/tutorial/sql_server_database_schemas.cfm
データベース内のすべてのテーブルのスキーマを変更するには、次のシステムで作成されたmsforeachtableストアドプロシージャを使用して、各テーブルのスキーマの名前をalterschemaで変更します。
exec sp_MSforeachtable "ALTER SCHEMA abc TRANSFER ? PRINT '? modified' "
文書化されていない/サポートされていない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キーワードと競合する可能性のあるテーブル名をエスケープするために角かっこが使用されます。