В 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 | +----------------------+------------+----------+---------------------+----------+
Добрата новина е, че изчислената колона се връща. Лошата новина е, че изгледът и съхранената процедура не се връщат.
Долен ред:Проверете за зависимости, преди да преименувате таблицата. След това актуализирайте ръчно всички обекти, които препращат към преименуваната таблица.