sql >> Databasteknik >  >> RDS >> Sqlserver

Byt namn på en tabell i SQL Server (T-SQL)

I SQL Server kan du använda sp_rename lagrad procedur för att byta namn på ett objekt, inklusive en tabell.

De flesta av de andra stora RDBM:erna låter dig byta namn på en tabell med ALTER TABLE uttalande, men detta är inte fallet med SQL Server.

Exempel

Här är ett exempel att visa:

EXEC sp_rename 't1', 't2';

Detta byter namn på tabellen som heter t1 till t2 .

Inklusive schemanamnet

Du kan också kvalificera den första tabellen med schemanamnet, i så fall kan den se ut ungefär så här:

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

I det här exemplet, dbo är schemanamnet, men du måste använda vilket schema som är tillämpligt.

Inklusive parameternamnen

Som med alla lagrade förfaranden kan du även inkludera parameternamnen när du anropar sp_rename :

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

sp_rename proceduren accepterar också en @objtype parameter, men detta krävs (eller stöds) inte när du byter namn på tabeller.

Sök efter referenser

När du byter namn på en tabell i SQL Server kommer du förmodligen att se ett meddelande så här:

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

Detta beror på att SQL Server inte gör det när du byter namn på en tabell byter automatiskt namn på alla referenser till den tabellen. Detta gäller även när du byter namn på en kolumn.

Trots varningsmeddelandet ovan har tabellen bytt namn ändå.

Innan du byter namn på några tabeller bör du därför alltid leta efter skript och lagrade procedurer som refererar till den tabellen. Du måste uppdatera sådana skript och procedurer för att referera till det nya tabellnamnet.

Du kan använda sys.sql_expression_dependencies systemkatalogvy för att göra denna kontroll.

Exempel:

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 det här fallet gick jag ihop med sys.objects för att returnera mer information.

Här är resultatet jag fick innan jag ändrade namnet på t1 tabell:

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

Det här visar mig att det finns en vy, en lagrad procedur och en beräknad kolumn som beror på t1 tabell. Den beräknade kolumnen (c2 ) refererar till c1 kolumn i samma tabell.

Som nämnts är det viktigt att köra den här kontrollen innan du ändrar namnet på tabellen. Här är resultatet jag får när jag kör samma skript efter att ha ändrat namnet 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 rows affected) 

I det här fallet använde jag tabellens ursprungliga namn (t1 ), så det är ganska uppenbart att vi inte ens riktade in oss på rätt tabell (t2 ).

Att helt enkelt ändra det här skriptet för att referera till det nya tabellnamnet fungerar inte heller. Till exempel köra följande skript efter att vi har ändrat namnet på tabellen från t1 till t2 returnerar bara ett beroende (den beräknade kolumnen).

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:

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

Den goda nyheten är att den beräknade kolumnen returneras. Den dåliga nyheten är att vyn och den lagrade proceduren inte returneras.

Slutsats:Kontrollera om det finns beroenden innan du byter namn på tabellen. Uppdatera sedan manuellt alla objekt som refererar till den omdöpta tabellen.


  1. Vilka är de kända sätten att lagra en trädstruktur i en relationsdatabas?

  2. Hur man får ålder i år, månader och dagar med Oracle

  3. Slinga över arraydimension i plpgsql

  4. SQLite - Välj Data