sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)で列の名前を変更する

    SQL Serverでは、sp_renameを使用できます 列を含むオブジェクトの名前を変更するためのストアドプロシージャ。

    デモンストレーションの例を次に示します。

    EXEC sp_rename 't1.c1', 'c11';

    これにより、c1という列の名前が変更されます (t1内 表)からc11

    オブジェクトタイプを含む

    3番目の引数としてオブジェクトタイプを含めることもできます。この場合、COLUMNを使用できます :

    EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';

    スキーマ名を含める

    最初の列をスキーマ名で修飾することもできます。その場合、次のようになります。

    EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';

    この例では、dbo はスキーマ名ですが、該当するスキーマを使用する必要があります。

    パラメータ名を含める

    他のストアドプロシージャと同様に、sp_renameを呼び出すときにパラメータ名を含めることもできます :

    EXEC sp_rename 
        @objname = 'dbo.t1.c1',
        @newname = 'c11',
        @objtype = 'COLUMN';

    参照を確認する

    SQL Serverで列の名前を変更すると、おそらく次のようなメッセージが表示されます。

    Caution: Changing any part of an object name could break scripts and stored procedures.

    これは、列の名前を変更しても、SQLServerはしないためです。 その列への参照の名前を自動的に変更します。これは、テーブルの名前を変更する場合にも当てはまります。

    上記の警告メッセージにもかかわらず、列の名前はとにかく変更されます。

    名前が変更された列を参照するビューをクエリしようとすると、エラーが発生します。

    SELECT * FROM vt1;

    結果:

    Msg 207, Level 16, State 1, Procedure vt1, Line 2
    Invalid column name 'c1'.
    Msg 4413, Level 16, State 1, Line 1
    Could not use view or function 'vt1' because of binding errors.
    >

    このビューはc1を参照しようとしています ただし、その列の名前は変更されているため、テーブルにその名前の列はありません。

    このビューの定義は次のようになります:

    CREATE VIEW vt1 AS
    SELECT c1, c2 FROM dbo.t1;

    新しい列名を参照するには、このビューを更新する必要があります。だから私たちはこれを行うことができます:

    ALTER VIEW vt1 AS
    SELECT c11, c2 FROM dbo.t1;

    ビューをクエリすると、正しいデータが返されます。

    したがって、列の名前を変更する前に、その列を参照するスクリプトとストアドプロシージャを常に確認する必要があります。新しい列名を参照するには、このようなスクリプトとプロシージャを更新する必要があります。

    sys.sql_expression_dependenciesを使用できます このチェックを行うためのシステムカタログビュー。

    計算列の名前の変更

    SQL Serverでは、計算列の名前を変更することはできません。

    計算列の名前を変更しようとすると、おそらく次のエラーメッセージが表示されます。

    EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';

    結果:

    Caution: Changing any part of an object name could break scripts and stored procedures.
    Msg 4928, Level 16, State 1, Procedure sp_rename, Line 689
    Cannot alter column 'c3' because it is 'COMPUTED'.

    この場合、c3 columnは、c2の値に基づいて計算を行う計算列です。 列。

    c2の名前を変更しようとすると次のようになります 列。

    EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';

    結果:

    Msg 15336, Level 16, State 1, Procedure sp_rename, Line 563
    Object 'dbo.t1.c2' cannot be renamed because the object participates in enforced dependencies.

    この列には別のエラーが表示されます。このエラーは、計算された列がこの列に依存しているためです。

    基本的に、計算列の名前を変更するには、列を削除して再度追加する必要があります。

    例:

    ALTER TABLE t1
    DROP COLUMN c3;
    
    ALTER TABLE t1
    ADD c13 AS c2 * 10;

    外部キー

    主キー列の名前を変更しても、その列を参照する外部キーは壊れません。

    たとえば、t1.c1の名前を変更する前 t1.c11へ 、言及しませんでしたが、実際には別のテーブルと列がありました(t2.c2t1.c1を参照している 。

    t1.c1の名前を変更した後 t1.c11へ 、t2.c2の外部キー制約 他のテーブルの主キー列の名前が変更されていても、外部キーに準拠するように新しい挿入を強制していました。


    1. パラメータ化されたSELECTクエリにPDOオブジェクトを適切に使用するにはどうすればよいですか?

    2. Oracleのビューとは何ですか?

    3. リンクサーバーでの疑似列の使用

    4. SQL更新は、更新の実行中にサブクエリに影響しますか?