sql >> Database teknologi >  >> RDS >> Sqlserver

Omdøb en tabel i SQL Server (T-SQL)

I SQL Server kan du bruge sp_rename gemt procedure til at omdøbe et objekt, inklusive en tabel.

De fleste af de andre større RDBM'er giver dig mulighed for at omdøbe en tabel med ALTER TABLE sætning, men dette er ikke tilfældet med SQL Server.

Eksempel

Her er et eksempel til demonstration:

EXEC sp_rename 't1', 't2'; 

Dette omdøber tabellen kaldet t1 til t2 .

Inklusive skemanavnet

Du kan også kvalificere den første tabel med skemanavnet, i hvilket tilfælde det kan se sådan ud:

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

I dette eksempel, dbo er skemanavnet, men du skal bruge det skema, der er relevant.

Inklusive parameternavnene

Som med enhver lagret procedure kan du også inkludere parameternavnene, når du kalder sp_rename :

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

sp_rename procedure accepterer også en @objtype parameter, men dette er ikke påkrævet (eller understøttet), når du omdøber tabeller.

Søg efter referencer

Når du omdøber en tabel i SQL Server, vil du sandsynligvis se en meddelelse som denne:

Forsigtig:Ændring af en hvilken som helst del af et objektnavn kan ødelægge scripts og lagrede procedurer.

Dette skyldes, at SQL Server ikke gør det, når du omdøber en tabel automatisk omdøbe eventuelle referencer til den tabel. Dette gælder også, når du omdøber en kolonne.

På trods af ovenstående advarselsmeddelelse omdøbes tabellen alligevel.

Før du omdøber nogen tabeller, bør du derfor altid tjekke for scripts og lagrede procedurer, der refererer til den tabel. Du bliver nødt til at opdatere sådanne scripts og procedurer for at referere til det nye tabelnavn.

Du kan bruge sys.sql_expression_dependencies systemkatalogvisning for at udføre denne kontrol.

Eksempel:

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

I dette tilfælde sluttede jeg mig til det med sys.objects for at returnere flere oplysninger.

Her er resultatet, jeg får, før jeg ændrede navnet på t1 tabel:

+-----------------------------+-----------------------------+ ----------+----------------------------+----------+ | Referenceenhed | Skriv | Kolonne | Referenceret enhed | Kolonne | |----------------------+----------------------+--- -------+----------------------------+-----------| | usp_t1 | SQL_STORED_PROCEDURE | (n/a) | t1 | (n/a) | | vt1 | SE | (n/a) | t1 | (n/a) | | t1 | USER_TABLE | c2 | t1 | c1 | +----------------------+----------------------+--- -------+----------------------------+----------+ 

Dette viser mig, at der er én visning, én lagret procedure og en beregnet kolonne, der afhænger af t1 bord. Den beregnede kolonne (c2 ) refererer til c1 kolonne i samme tabel.

Som nævnt er det vigtigt at køre dette tjek, før du ændrer navnet på tabellen. Her er resultatet, jeg får, når jeg kører det samme script efter at have ændret navnet på tabellen.

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

Resultat:

(0 rækker påvirket) 

I dette tilfælde brugte jeg tabellens oprindelige navn (t1 ), så det er helt indlysende, at vi ikke engang målrettede den korrekte tabel (t2 ).

Blot at ændre dette script for at referere til det nye tabelnavn virker heller ikke. For eksempel at køre følgende script, efter at vi har ændret navnet på tabellen fra t1 til t2 returnerer kun én afhængighed (den beregnede kolonne).

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

Resultat:

+-----------------------+------------+-------- +----------------------------+----------+ | Referenceenhed | Skriv | Kolonne | Referenceret enhed | Kolonne | |----------------------+------------------ ------------------+--------| | t2 | USER_TABLE | c2 | t2 | c1 | +------------------------------------------- ------------------+----------+ 

Den gode nyhed er, at den beregnede kolonne returneres. Den dårlige nyhed er, at visningen og den lagrede procedure ikke returneres.

Nederste linje:Tjek for afhængigheder, før du omdøber tabellen. Opdater derefter manuelt alle objekter, der refererer til den omdøbte tabel.


  1. Venstre og højre forbinder ved hjælp af plus (+)-log på Oracle

  2. Hvorfor tager Microsoft SQL Server 2012-forespørgsler minutter over JDBC 4.0, men sekund(er) i Management Studio?

  3. Oracle:Bulk Collect-ydelse

  4. Hvorfor bruger iteration gennem et stort Django QuerySet enorme mængder hukommelse?