In SQL Server kunt u de sp_rename
. gebruiken opgeslagen procedure om een object te hernoemen, inclusief een tabel.
Met de meeste andere grote RDBM's kun je een tabel hernoemen met de ALTER TABLE
statement, maar dit is niet het geval met SQL Server.
Voorbeeld
Hier is een voorbeeld om te demonstreren:
EXEC sp_rename 't1', 't2';
Dit hernoemt de tabel met de naam t1
naar t2
.
Inclusief de Schemanaam
U kunt de eerste tabel ook kwalificeren met de schemanaam, in welk geval deze er ongeveer zo uit kan zien:
EXEC sp_rename 'dbo.t1', 't2';
In dit voorbeeld dbo
is de schemanaam, maar je moet het schema gebruiken dat van toepassing is.
Inclusief de parameternamen
Zoals bij elke opgeslagen procedure, kunt u ook de parameternamen opnemen bij het aanroepen van sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1',
@newname = 't2';
De sp_rename
procedure accepteert ook een @objtype
parameter, maar dit is niet vereist (of ondersteund) bij het hernoemen van tabellen.
Controleer op referenties
Wanneer u de naam van een tabel in SQL Server wijzigt, ziet u waarschijnlijk een bericht als dit:
Caution: Changing any part of an object name could break scripts and stored procedures.
Dit komt omdat wanneer u de naam van een tabel wijzigt, SQL Server niet hernoem automatisch alle verwijzingen naar die tabel. Dit geldt ook wanneer u de naam van een kolom wijzigt.
Ondanks de waarschuwing hierboven, wordt de tafel toch hernoemd.
Daarom moet u, voordat u de naam van tabellen wijzigt, altijd controleren op scripts en opgeslagen procedures die naar die tabel verwijzen. U moet dergelijke scripts en procedures bijwerken om naar de nieuwe tabelnaam te verwijzen.
U kunt de sys.sql_expression_dependencies
. gebruiken systeemcatalogusweergave om deze controle uit te voeren.
Voorbeeld:
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');
In dit geval heb ik het samengevoegd met sys.objects
om meer informatie terug te sturen.
Dit is het resultaat dat ik krijg voordat ik de naam van de t1
wijzigde tafel:
+----------------------+----------------------+----------+---------------------+----------+ | 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 | +----------------------+----------------------+----------+---------------------+----------+
Dit laat me zien dat er één weergave, één opgeslagen procedure en een berekende kolom is die afhankelijk zijn van de t1
tafel. De berekende kolom (c2
) verwijst naar de c1
kolom in dezelfde tabel.
Zoals vermeld, is het belangrijk om deze controle uit te voeren voordat u de naam van de tabel wijzigt. Dit is het resultaat dat ik krijg als ik hetzelfde script uitvoer nadat ik de naam van de tabel heb gewijzigd.
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');
Resultaat:
(0 rows affected)
In dit geval heb ik de originele naam van de tabel gebruikt (t1
), dus het is vrij duidelijk dat we niet eens de juiste tabel hebben getarget (t2
).
Het simpelweg wijzigen van dit script om naar de nieuwe tabelnaam te verwijzen, werkt ook niet. Als u bijvoorbeeld het volgende script uitvoert nadat we de naam van de tabel hebben gewijzigd van t1
naar t2
geeft slechts één afhankelijkheid terug (de berekende kolom).
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');
Resultaat:
+----------------------+------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+------------+----------+---------------------+----------| | t2 | USER_TABLE | c2 | t2 | c1 | +----------------------+------------+----------+---------------------+----------+
Het goede nieuws is dat de berekende kolom wordt geretourneerd. Het slechte nieuws is dat de weergave en de opgeslagen procedure niet worden geretourneerd.
Kortom:controleer op afhankelijkheden voordat u de tabel een andere naam geeft. Werk vervolgens handmatig alle objecten bij die verwijzen naar de hernoemde tabel.