Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengganti nama Tabel di SQL Server (T-SQL)

Di SQL Server, Anda dapat menggunakan sp_rename prosedur tersimpan untuk mengganti nama objek, termasuk tabel.

Sebagian besar RDBM utama lainnya memungkinkan Anda mengganti nama tabel dengan ALTER TABLE pernyataan, tetapi ini tidak terjadi dengan SQL Server.

Contoh

Berikut ini contoh untuk didemonstrasikan:

EXEC sp_rename 't1', 't2';

Ini mengganti nama tabel yang disebut t1 ke t2 .

Termasuk Nama Skema

Anda juga dapat memenuhi syarat tabel pertama dengan nama skema, dalam hal ini, mungkin terlihat seperti ini:

EXEC sp_rename 'dbo.t1', 't2';

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',
    @newname = 't2';

sp_rename prosedur juga menerima @objtype parameter, tetapi ini tidak diperlukan (atau didukung) saat mengganti nama tabel.

Periksa Referensi

Saat Anda mengganti nama tabel 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 tabel, SQL Server tidak secara otomatis mengganti nama referensi ke tabel itu. Hal ini juga berlaku saat Anda mengganti nama kolom.

Terlepas dari pesan peringatan di atas, tabel tetap diganti namanya.

Oleh karena itu, sebelum Anda mengganti nama tabel apa pun, Anda harus selalu memeriksa skrip dan prosedur tersimpan yang mereferensikan tabel tersebut. Anda perlu memperbarui skrip dan prosedur tersebut untuk mereferensikan nama tabel baru.

Anda dapat menggunakan sys.sql_expression_dependencies tampilan katalog sistem untuk melakukan pemeriksaan ini.

Contoh:

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');

Dalam hal ini saya bergabung dengan sys.objects untuk mengembalikan lebih banyak informasi.

Berikut hasil yang saya dapatkan sebelum saya mengubah nama t1 tabel:

+----------------------+----------------------+----------+---------------------+----------+
 | 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       |
 +----------------------+----------------------+----------+---------------------+----------+ 

Ini menunjukkan kepada saya bahwa ada satu tampilan, satu prosedur tersimpan, dan kolom terhitung yang bergantung pada t1 meja. Kolom yang dihitung (c2 ) mereferensikan c1 kolom dalam tabel yang sama.

Seperti yang disebutkan, penting untuk menjalankan pemeriksaan ini sebelum Anda mengubah nama tabel. Inilah hasil yang saya dapatkan ketika menjalankan skrip yang sama setelah mengubah nama tabel.

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');

Hasil:

(0 rows affected) 

Dalam hal ini, saya menggunakan nama asli tabel (t1 ), jadi cukup jelas bahwa kami bahkan tidak menargetkan tabel yang benar (t2 ).

Cukup mengubah skrip ini untuk mereferensikan nama tabel baru juga tidak akan berfungsi. Misalnya, menjalankan skrip berikut setelah kami mengubah nama tabel dari t1 ke t2 mengembalikan hanya satu ketergantungan (kolom yang dihitung).

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');

Hasil:

+----------------------+------------+----------+---------------------+----------+
 | Referencing Entity   | Type       | Column   | Referenced Entity   | Column   |
 |----------------------+------------+----------+---------------------+----------|
 | t2                   | USER_TABLE | c2       | t2                  | c1       |
 +----------------------+------------+----------+---------------------+----------+ 

Kabar baiknya adalah kolom yang dihitung dikembalikan. Kabar buruknya adalah tampilan dan prosedur tersimpan tidak dikembalikan.

Intinya:Periksa dependensi sebelum Anda mengganti nama tabel. Kemudian perbarui secara manual objek apa pun yang mereferensikan tabel yang diubah namanya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menentukan nomor port dalam string koneksi SQL Server?

  2. Bagaimana Anda membuka file SDF (SQL Server Compact Edition)?

  3. SYSDATETIME() Contoh di SQL Server (T-SQL)

  4. Menyisipkan beberapa baris dalam satu kueri SQL?

  5. Apa itu @@MAX_PRECISION di SQL Server?