it-swarm.com.de

So machen Sie ALTER TABLE TYPE effizient

Im Gegensatz zu Tabellen kann ein Tabellentyp nicht mit einem einfachen Befehl geändert werden. Ich muss Folgendes tun:

  1. Benennen Sie den vorhandenen Tabellentyp um
  2. Erstellen Sie den neuen Tabellentyp
  3. Öffnen Sie alle betroffenen Objekte (d. H. ALTER SP) und führen Sie sie erneut aus, damit der Verweis auf den Tabellentyp aktualisiert wird.

Dies ist jedoch eine mühsame Aufgabe, da möglicherweise viele SP) aktualisiert werden müssen. Gibt es einen einfachen Weg/ein vorgeneriertes Skript, das diesen Prozess automatisieren kann?

5
rcs

Anstatt

Öffnen Sie alle betroffenen Objekte (d. H. ALTER SP) und führen Sie sie erneut aus, damit der Verweis auf den Tabellentyp aktualisiert wird

sie können einfach alle betroffenen Objekte finden und mit sp_refreshsqlmodule aktualisieren.

Hier ist der Code, um die Module zu finden:

select object_name(referencing_id)
from sys.sql_expression_dependencies
where referenced_class_desc = 'TYPE' and referenced_entity_name =  'your_table_type_name';

Um all diese Objekte zu aktualisieren, können Sie einfach die folgenden Befehle generieren:

select 'sp_refreshsqlmodule ' + quotename( object_name(referencing_id), '''')
from sys.sql_expression_dependencies
where referenced_class_desc = 'TYPE' and referenced_entity_name =  'your_table_type_name';

Machen Sie die Ausgabe in Text anstelle von Raster und kopieren Sie eingefügte Zeilen + fügen Sie sie in SSMS ein und führen Sie sie aus.

7
sepupic

Als Referenz, basierend auf @sepupics Antwort, ich kann es weiter verbessern, um zu sein:

-- First, rename existing table type to something else
EXEC sp_rename 'TT_MY_TABLE_TYPE', 'TT_MY_TABLE_TYPE_1'

-- Create the new table type
CREATE TYPE [dbo].[TT_MY_TABLE_TYPE] AS TABLE(
    [MY_FIELD] [varchar](20) NULL        
)
GO

-- Do a refresh of the SP/views so that the SP/views will refer to the new table type
-- Save the list of dependencies to a temporary table
SELECT  'sp_refreshsqlmodule ' + quotename( object_name(referencing_id), '''') AS SQL_CMD
INTO    #TEMPSQL
FROM    sys.sql_expression_dependencies
WHERE   referenced_class_desc = 'TYPE' and referenced_entity_name =  'TT_MY_TABLE_TYPE';

DECLARE @sql NVARCHAR(1000)
-- Do a loop for the list of dependencies, use dynamic SQL to execute the SQL commands
DECLARE c_Cur CURSOR FOR
    SELECT  SQL_CMD
    FROM    #TEMPSQL

OPEN c_Cur
FETCH NEXT FROM c_Cur INTO @sql
WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC SP_EXECUTESQL @statement = @sql
    FETCH NEXT FROM c_Cur INTO @sql
END

CLOSE c_Cur
DEALLOCATE c_Cur

-- Drop the old table type
DROP TYPE TT_MY_TABLE_TYPE_1

DROP TABLE #TEMPSQL
2
rcs