列の名前をSQL Server 2008に変更する


653

SQL Server 2008とNavicatを使用しています。SQLを使用してテーブルの列の名前を変更する必要があります。

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

このステートメントは機能しません。



5
これはswethaがリンクした質問#174582とまったく同じではないことに注意してください。これはMS SQL固有であり、データベースに依存しません。

回答:


1195

使用する sp_rename

EXEC sp_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN'

参照:SQL SERVER –列名またはテーブル名を変更する方法

ドキュメント:sp_rename(Transact-SQL)

あなたの場合、それは:

EXEC sp_RENAME 'table_name.old_name', 'new_name', 'COLUMN'

値は単一引用符で囲んでください。


24
SQL Serverは新しい列の名前として[[[NewColumnName]]]を使用するため、NewColumnNameを角括弧で囲まないでください。また、sp_renameの前にEXECまたはEXECUTEを付ける必要があります。
Mark Freeman、

29
列を識別するために、最初のパラメーターに角かっこを置くことは許可され、推奨されますが、2番目のパラメーターには使用できません。このように:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch

2
あなたは、このストアドプロシージャのハンドルのデフォルト値は、nullなどというあなたの答えに注意する必要がありますcontraintsプレーンとは反対に、名前の変更をしている間alter table、そのような制約が存在する場合に失敗します。
TuncayGöncüoğlu2017

4
'table_name.new_name'を使用すると、[schema]。[table_name]。[table_name.new_name]になることに注意してください。そのため、そのテーブル名を新しい名前にしないでください。(この回答では正解です。のぞき見についてのメモを追加するだけです)
Mark Schultheiss 2017年

1
データベースにスキーマがある場合、スキーマ名をテーブル名の前に置く必要があります:EXEC sp_RENAME 'schema_name.table_name.old_name'、 'new_name'、 'C​​OLUMN'
amin

106

の代わりにSQL、Microsoft SQL Server Management Studioでこれを行うことができます。GUIを使用するいくつかの簡単な方法を次に示します。

最初の方法

列をゆっくりとダブルクリックします。列名が編集可能なテキストボックスになります。


二番目の方法

列を右クリックし、コンテキストメニューから[名前変更]を選択します。

例えば:

列名を変更するには


第三の方法

この方法は、一度に複数の列の名前を変更する必要がある場合に適しています。

  1. 名前を変更する必要のある列を含むテーブルを右クリックします。
  2. [ デザイン]をクリックします。
  3. テーブルデザインパネルで、変更する列名のテキストボックスをクリックして編集します。

例えば: MSSMSテーブルデザインの例

注:私はOPが特にSQLソリューションを求めていることを知っています。


1
または、ユーザーに権限がありません。
Carrie Kendall 2014年

6
絶対にしないでください。テーブルをコピーしてから、古いテーブルを削除して名前を変更します。GUIを使用して、テーブルに関する変更を行わないでください。
HLGEM 2014

6
@HLGEMは非常に大きな包括的なステートメントです。いずれにせよ、あなたはあなたが説明したことに何らかのリソースを提供できますか?つまり、テーブルのドロップなど
Carrie Kendall

2
@CarrieKendall、変更を行う代わりに、GUIから変更をスクリプト化すると、表示されます。これが、sp_renameまたはalter tableを使用するよりも、GUIを使用して大きなテーブルを変更する方がはるかに遅い理由です。さらに、データベース構造への変更はコードの変更であり、他のコードと同様にソース管理で行う必要があるため、スクリプトで行う必要があります。いずれにしてもスクリプトが必要になるため、開発本番データベースにテーブルの変更を許可しない場合、これは特に重要です。また、prodに数百万のレコードがあるテーブルをコピー、ドロップ、再作成する必要はありません。
HLGEM 2014

18
プロファイラーを実行した状態でManagement Studioを使用してSQL Server 2012テーブルの名前を変更し、sp_renameを使用しました。しかし、以前のバージョンについて話すことはできません。
スティーブダウリング2015

58

試してください:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'

27

テーブルのスキーマも指定する必要があります。そうしないと、次のエラーが発生する可能性があります。

メッセージ15248、レベル11、状態1、プロシージャsp_rename、行238パラメータ@objnameがあいまいであるか、要求された@objtype(COLUMN)が間違っています。

展開スクリプトの場合は、セキュリティを強化することもお勧めします。

IF EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'OldColumnName' AND
            object_name(object_id) = 'TableName'
    ) AND
    NOT EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'NewColumnName' AND
            object_name(object_id) = 'TableName'
    )
    EXEC sp_RENAME 'SchemaName.TableName.OldColumnName', 'NewColumnName', 'COLUMN';

私はこの安全なアプローチが好きです。異なる環境で動作する場合と動作しない場合があるマイグレーションを作成するのに適しています。
Adil H. Raza

存在チェックのように、他のスクリプトのバッチの一部として再実行しても大丈夫だと感じます
不明

19

すでに組み込まれている関数を使用することをお勧めしますが、別の方法は次のとおりです。

  1. 同じデータ型と新しい名前で新しい列を作成します。
  2. UPDATE / INSERTステートメントを実行して、すべてのデータを新しい列にコピーします。
  3. 古い列を削除します。

を使用することの背後にある利点sp_renameは、それに関連するすべての関係を処理することです。

ドキュメントから:

sp_renameは、PRIMARY KEYまたはUNIQUE制約の名前が変更されるたびに、関連するインデックスの名前を自動的に変更します。名前が変更されたインデックスがPRIMARY KEY制約に関連付けられている場合、PRIMARY KEY制約もsp_renameによって自動的に名前が変更されます。sp_renameを使用して、プライマリおよびセカンダリXMLインデックスの名前を変更できます。


*ステップ1では、新しい列でNULLを許可する必要があります*オプションで、新しい列を変更するための4番目のステップを追加して、NULL値を許可しない
BitLauncher

16

を使用sp_renameして、列の名前を変更できます。

USE YourDatabase;  
GO  
EXEC sp_rename 'TableName.OldColumnName', 'NewColumnName', 'COLUMN';  
GO  

最初のパラメータを変更する目的で、2番目のパラメータは、オブジェクトを説明する新たな名前であり、そして第3のパラメータCOLUMNは、名前の変更のためのものであることをサーバに通知しcolumn、また、名前を変更するために使用することができtablesindexそしてalias data type


2
わからない、sp_renameに関する5つのうち4つ以上の言及に新しい回答を追加する理由...?
Pawel Czapski 2017年

3
ある時点で、誰かがパラメータの操作をここで説明する必要がありますが、だれもこれを実行しませんでした
Alexandre Neukirchen

1
ええ、実際にあなたは正しいです、私にとってそれは明白ですが、新しい若者にとってはそうではないかもしれません。
Pawel Czapski 2017年

12

私はよくここに来て、括弧の使い方を知りたいので、この答えは私のような人に役立つかもしれません。

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • はに含まれていてはOldColumnNameなりません[]。効果がないでしょう。
  • 入れないでくださいNewColumnName[]、それがになります[[NewColumnName]]

3

SQL Server管理スタジオには、システム定義のストアドプロシージャ(SP)がいくつかあります。
その1つは列の名前を変更するために使用されます。SPはsp_renameです。

構文: sp_rename '[table_name] .old_column_name'、 'new_column_name'
詳細については、この記事を参照してください: sp_rename by Microsoft Docs

注:このSPを実行すると、SQLサーバーから「警告:オブジェクト名の一部を変更するとスクリプトやストアドプロシージャが壊れる可能性があります」という警告メッセージが表示されます。これは、列を含む独自のspを作成した場合にのみ重要ですテーブルで変更しようとしています。


2

@Taherの改良版

DECLARE @SchemaName AS VARCHAR(128)
DECLARE @TableName AS VARCHAR(128)
DECLARE @OldColumnName AS VARCHAR(128)
DECLARE @NewColumnName AS VARCHAR(128)
DECLARE @ParamValue AS VARCHAR(1000)

SET @SchemaName = 'dbo'
SET @TableName = 'tableName'
SET @OldColumnName = 'OldColumnName'
SET @NewColumnName = 'NewColumnName'
SET @ParamValue = @SchemaName + '.' + @TableName + '.' + @OldColumnName

IF EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @OldColumnName AND OBJECT_NAME(object_id) = @TableName
)
AND NOT EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @NewColumnName AND OBJECT_NAME(object_id) = @TableName
)
BEGIN
    EXEC sp_rename @ParamValue, @NewColumnName, 'COLUMN';
END

0

または、SQL Management Studioで列を2回ゆっくりクリックして、UIから名前を変更することもできます...


-1

クエリを実行:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'

多くの賛成票を投じて、長年にわたる既存の回答を繰り返さないでください。
TT。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.