Di SQL Server, Anda dapat menggunakan sp_rename
prosedur tersimpan untuk mengganti nama objek, termasuk kolom.
Contoh
Berikut ini contoh untuk didemonstrasikan:
EXEC sp_rename 't1.c1', 'c11';
Ini mengganti nama kolom yang disebut c1
(dalam t1
tabel) ke c11
.
Termasuk Jenis Objek
Anda juga dapat menyertakan tipe objek sebagai argumen ketiga. Dalam hal ini, kita dapat menggunakan COLUMN
:
EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';
Termasuk Nama Skema
Anda juga dapat memenuhi syarat kolom pertama dengan nama skema, dalam hal ini, mungkin terlihat seperti ini:
EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';
Dalam contoh ini, dbo
adalah nama skema, tetapi Anda harus menggunakan skema apa pun yang berlaku.
Termasuk Nama Parameter
Seperti prosedur tersimpan lainnya, Anda juga dapat menyertakan nama parameter saat memanggil sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1.c1',
@newname = 'c11',
@objtype = 'COLUMN';
Periksa Referensi
Saat Anda mengganti nama kolom di SQL Server, Anda mungkin akan melihat pesan seperti ini:
Caution: Changing any part of an object name could break scripts and stored procedures.
Ini karena ketika Anda mengganti nama kolom, SQL Server tidak secara otomatis mengganti nama referensi ke kolom itu. Hal ini juga berlaku saat Anda mengganti nama tabel.
Terlepas dari pesan peringatan di atas, kolom tersebut tetap diganti namanya.
Jika kami mencoba mengkueri tampilan yang mereferensikan kolom yang diganti namanya, kami mendapatkan kesalahan.
SELECT * FROM vt1;
Hasil:
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.
Tampilan ini mencoba merujuk ke c1
tapi kolom itu telah diganti namanya, jadi tidak ada kolom dengan nama itu di tabel.
Definisi tampilan ini terlihat seperti ini:
CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;
Kami perlu memperbarui tampilan ini untuk merujuk nama kolom baru. Jadi kita bisa melakukan ini:
ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;
Sekarang menanyakan tampilan akan mengembalikan data yang benar.
Oleh karena itu, sebelum Anda mengganti nama kolom apa pun, Anda harus selalu memeriksa skrip dan prosedur tersimpan yang mereferensikan kolom tersebut. Anda perlu memperbarui skrip dan prosedur tersebut untuk mereferensikan nama kolom baru.
Anda dapat menggunakan sys.sql_expression_dependencies
tampilan katalog sistem untuk melakukan pemeriksaan ini.
Mengganti Nama Kolom yang Dihitung
SQL Server tidak mengizinkan kami mengganti nama kolom yang dihitung.
Jika Anda mencoba mengganti nama kolom yang dihitung, Anda mungkin akan melihat pesan kesalahan berikut.
EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';
Hasil:
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'.
Dalam hal ini, c3
kolom adalah kolom yang dihitung yang melakukan perhitungan berdasarkan nilai dalam c2
kolom.
Inilah yang terjadi ketika kami mencoba mengganti nama c2
kolom.
EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';
Hasil:
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.
Kami mendapatkan kesalahan yang berbeda untuk kolom ini. Kesalahan ini karena kolom yang dihitung bergantung pada kolom ini.
Pada dasarnya, untuk mengganti nama kolom yang dihitung, kita perlu menghapusnya dan menambahkannya lagi.
Contoh:
ALTER TABLE t1
DROP COLUMN c3;
ALTER TABLE t1
ADD c13 AS c2 * 10;
Kunci Asing
Mengganti nama kolom kunci utama tidak akan merusak kunci asing apa pun yang mereferensikan kolom itu.
Misalnya, sebelum saya mengganti nama t1.c1
ke t1.c11
, meskipun saya tidak menyebutkannya, saya sebenarnya memiliki tabel dan kolom lain (t2.c2
) yang mereferensikan t1.c1
.
Setelah mengganti nama t1.c1
ke t1.c11
, batasan kunci asing pada t2.c2
masih menerapkan sisipan baru untuk mematuhi kunci asing, meskipun kolom kunci utama di tabel lain telah diubah namanya.