Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zmień nazwę tabeli w SQL Server (T-SQL)

W SQL Server możesz użyć sp_rename procedura składowana do zmiany nazwy obiektu, w tym tabeli.

Większość innych głównych RDBM umożliwia zmianę nazwy tabeli za pomocą ALTER TABLE oświadczenie, ale tak nie jest w przypadku SQL Server.

Przykład

Oto przykład do zademonstrowania:

EXEC sp_rename 't1', 't2';

Zmienia to nazwę tabeli o nazwie t1 do t2 .

W tym nazwa schematu

Możesz również zakwalifikować pierwszą tabelę nazwą schematu, w takim przypadku może to wyglądać mniej więcej tak:

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

W tym przykładzie dbo to nazwa schematu, ale musisz użyć dowolnego schematu.

W tym nazwy parametrów

Podobnie jak w przypadku każdej procedury składowanej, można również dołączyć nazwy parametrów podczas wywoływania sp_rename :

EXEC sp_rename 
    @objname = 'dbo.t1',
    @newname = 't2';

sp_rename procedura akceptuje również @objtype parametr, ale nie jest to wymagane (lub obsługiwane) podczas zmiany nazw tabel.

Sprawdź referencje

Gdy zmienisz nazwę tabeli w SQL Server, prawdopodobnie zobaczysz taki komunikat:

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

Dzieje się tak, ponieważ po zmianie nazwy tabeli SQL Server nie automatycznie zmień nazwy wszystkich odwołań do tej tabeli. Dotyczy to również zmiany nazwy kolumny.

Pomimo powyższego ostrzeżenia, nazwa tabeli i tak została zmieniona.

Dlatego przed zmianą nazw tabel należy zawsze sprawdzić skrypty i procedury składowane, które odwołują się do tej tabeli. Będziesz musiał zaktualizować takie skrypty i procedury, aby odwoływały się do nowej nazwy tabeli.

Możesz użyć sys.sql_expression_dependencies widok katalogu systemowego, aby to sprawdzić.

Przykład:

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

W tym przypadku dołączyłem do niego za pomocą sys.objects aby zwrócić więcej informacji.

Oto wynik, który otrzymałem, zanim zmieniłem nazwę t1 tabela:

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

To pokazuje mi, że istnieje jeden widok, jedna procedura składowana i kolumna obliczona, które zależą od t1 stół. Obliczona kolumna (c2 ) odwołuje się do c1 kolumna w tej samej tabeli.

Jak wspomniano, ważne jest, aby przeprowadzić tę kontrolę przed zmianą nazwy tabeli. Oto wynik, który otrzymuję po uruchomieniu tego samego skryptu po zmianie nazwy tabeli.

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

Wynik:

(0 rows affected) 

W tym przypadku użyłem oryginalnej nazwy tabeli (t1 ), więc jest całkiem oczywiste, że nie celowaliśmy nawet w odpowiednią tabelę (t2 ).

Po prostu zmiana tego skryptu, aby odwoływać się do nowej nazwy tabeli, również nie zadziała. Na przykład uruchomienie następującego skryptu po zmianie nazwy tabeli z t1 do t2 zwraca tylko jedną zależność (kolumnę wyliczoną).

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

Wynik:

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

Dobrą wiadomością jest to, że obliczona kolumna jest zwracana. Zła wiadomość jest taka, że ​​widok i procedura składowana nie są zwracane.

Konkluzja:Sprawdź zależności przed zmianą nazwy tabeli. Następnie ręcznie zaktualizuj wszystkie obiekty, które odwołują się do tabeli o zmienionej nazwie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:kolumny indeksu używane w podobnym?

  2. Radzenie sobie z wartościami NULL w SQL Server

  3. Dodaj nową kolumnę tabeli do określonej pozycji porządkowej w Microsoft SQL Server

  4. Skutecznie rozwiąż problem z bazą danych SQL Server utknął w trybie podejrzanym

  5. Jak przekonwertować puste spacje na wartości null za pomocą SQL Server?