Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преименувайте таблица в SQL Server (T-SQL)

В SQL Server можете да използвате sp_rename съхранена процедура за преименуване на обект, включително таблица.

Повечето от другите основни RDBM ви позволяват да преименувате таблица с ALTER TABLE изявление, но това не е така със SQL Server.

Пример

Ето пример за демонстрация:

EXEC sp_rename 't1', 't2';

Това преименува таблицата, наречена t1 до t2 .

Включително името на схемата

Можете също да квалифицирате първата таблица с името на схемата, като в този случай тя може да изглежда така:

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

В този пример dbo е името на схемата, но ще трябва да използвате каквато и да е приложима схема.

Включително имената на параметрите

Както при всяка съхранена процедура, можете също да включите имената на параметрите, когато извиквате sp_rename :

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

sp_rename процедурата също така приема @objtype параметър, но това не се изисква (или се поддържа) при преименуване на таблици.

Проверка за препратки

Когато преименувате таблица в SQL Server, вероятно ще видите съобщение като това:

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

Това е така, защото когато преименувате таблица, SQL Server не автоматично преименувайте всички препратки към тази таблица. Това е вярно и когато преименувате колона.

Въпреки горното предупредително съобщение, таблицата все пак е преименувана.

Следователно, преди да преименувате каквито и да е таблици, винаги трябва да проверявате за скриптове и съхранени процедури, които препращат към тази таблица. Ще трябва да актуализирате такива скриптове и процедури, за да посочите името на новата таблица.

Можете да използвате sys.sql_expression_dependencies изглед на системния каталог, за да направите тази проверка.

Пример:

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

В този случай го присъединих с sys.objects за да върнете повече информация.

Ето резултата, който получавам, преди да сменя името на t1 таблица:

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

Това ми показва, че има един изглед, една съхранена процедура и изчислена колона, които зависят от t1 маса. Изчислената колона (c2 ) препраща към c1 колона в същата таблица.

Както споменахме, важно е да изпълните тази проверка, преди да промените името на таблицата. Ето резултата, който получавам, когато изпълнявам същия скрипт след промяна на името на таблицата.

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

Резултат:

(0 rows affected) 

В този случай използвах оригиналното име на таблицата (t1 ), така че е съвсем очевидно, че дори не сме се насочили към правилната таблица (t2 ).

Просто промяната на този скрипт за препратка към новото име на таблица също няма да работи. Например, изпълняване на следния скрипт, след като сме променили името на таблицата от t1 до t2 връща само една зависимост (изчислената колона).

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

Резултат:

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

Добрата новина е, че изчислената колона се връща. Лошата новина е, че изгледът и съхранената процедура не се връщат.

Долен ред:Проверете за зависимости, преди да преименувате таблицата. След това актуализирайте ръчно всички обекти, които препращат към преименуваната таблица.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JPA SQL Server Без диалектно съпоставяне за JDBC тип:-9

  2. Редът на Sql JOIN влияе ли на производителността?

  3. INSERT INTO @TABLE EXEC @query със SQL Server 2000

  4. Как да извика съхранена процедура в изглед?

  5. 4 причини, поради които трябва да дадете приоритет на наблюдението на база данни във вашето планиране за 2020 г.