SQL Serverでは、sp_rename
を使用できます テーブルを含むオブジェクトの名前を変更するためのストアドプロシージャ。
他の主要なRDBMのほとんどでは、ALTER TABLE
を使用してテーブルの名前を変更できます。 ステートメントですが、SQLServerの場合はそうではありません。
例
デモンストレーションの例を次に示します。
EXEC sp_rename 't1', 't2';
これにより、t1
というテーブルの名前が変更されます t2
へ 。
スキーマ名を含める
最初のテーブルをスキーマ名で修飾することもできます。その場合、次のようになります。
EXEC sp_rename 'dbo.t1', 't2';
この例では、dbo
はスキーマ名ですが、該当するスキーマを使用する必要があります。
パラメータ名を含める
他のストアドプロシージャと同様に、sp_rename
を呼び出すときにパラメータ名を含めることもできます :
EXEC sp_rename
@objname = 'dbo.t1',
@newname = 't2';
sp_rename
プロシージャは@objtype
も受け入れます パラメータですが、テーブルの名前を変更する場合、これは必須ではありません(またはサポートされていません)。
参照を確認する
SQL Serverでテーブルの名前を変更すると、おそらく次のようなメッセージが表示されます。
Caution: Changing any part of an object name could break scripts and stored procedures.
これは、テーブルの名前を変更するときに、SQLServerがしないためです。 そのテーブルへの参照の名前を自動的に変更します。これは、列の名前を変更する場合にも当てはまります。
上記の警告メッセージにもかかわらず、テーブルの名前はとにかく変更されます。
したがって、テーブルの名前を変更する前に、そのテーブルを参照するスクリプトとストアドプロシージャを常に確認する必要があります。新しいテーブル名を参照するには、このようなスクリプトとプロシージャを更新する必要があります。
sys.sql_expression_dependencies
を使用できます このチェックを行うためのシステムカタログビュー。
例:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't1');
この場合、sys.objects
で結合しました 詳細情報を返します。
t1
の名前を変更する前に得られた結果は次のとおりです。 テーブル:
+----------------------+----------------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+----------------------+----------+---------------------+----------| | usp_t1 | SQL_STORED_PROCEDURE | (n/a) | t1 | (n/a) | | vt1 | VIEW | (n/a) | t1 | (n/a) | | t1 | USER_TABLE | c2 | t1 | c1 | +----------------------+----------------------+----------+---------------------+----------+
これは、t1
に依存する1つのビュー、1つのストアドプロシージャ、および計算列があることを示しています。 テーブル。計算列(c2
)c1
を参照します 同じテーブルの列。
前述のように、テーブルの名前を変更する前に、このチェックを実行することが重要です。テーブルの名前を変更した後、同じスクリプトを実行したときに得られる結果は次のとおりです。
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't1');
結果:
(0 rows affected)
この場合、テーブルの元の名前(t1
)を使用しました )、したがって、正しいテーブル(t2
)をターゲットにしていないことは明らかです。 。
このスクリプトを変更して新しいテーブル名を参照するだけでも機能しません。たとえば、テーブルの名前をt1
から変更した後、次のスクリプトを実行します。 t2
へ 1つの依存関係(計算された列)のみを返します。
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't2');
結果:
+----------------------+------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+------------+----------+---------------------+----------| | t2 | USER_TABLE | c2 | t2 | c1 | +----------------------+------------+----------+---------------------+----------+
良いニュースは、計算された列が返されることです。悪いニュースは、ビューとストアドプロシージャが返されないことです。
結論:テーブルの名前を変更する前に、依存関係を確認してください。次に、名前が変更されたテーブルを参照するオブジェクトを手動で更新します。