web-dev-qa-db-de.com

Ändern benutzerdefinierter Tabellentypen in SQL Server

Wie kann ich einen benutzerdefinierten Tabellentyp in SQL Server ändern?

70
yogi

Meines Wissens ist es unmöglich, einen Tabellentyp zu ändern. Sie können den Typ mit einem anderen Namen erstellen und dann den alten Typ löschen und in den neuen Namen ändern

Dank an jkrajes

Gemäß msdn kann die benutzerdefinierte Tabellentypdefinition nach der Erstellung nicht mehr geändert werden.

63

Dies ist eine Art Hack, scheint aber zu funktionieren. Im Folgenden finden Sie die Schritte und ein Beispiel zum Ändern eines Tabellentyps. Eine Anmerkung ist, dass das sp_refreshsqlmodule fehlschlägt, wenn die Änderung, die Sie an dem Tabellentyp vorgenommen haben, eine brechende Änderung an diesem Objekt ist, normalerweise eine Prozedur.

  1. Verwenden sp_rename Um den Tabellentyp umzubenennen, füge ich normalerweise nur z am Anfang des Namens hinzu.
  2. Erstellen Sie einen neuen Tabellentyp mit dem ursprünglichen Namen und allen Änderungen, die Sie am Tabellentyp vornehmen müssen.
  3. Durchlaufen Sie jede Abhängigkeit und führen Sie sp_refreshsqlmodule drauf.
  4. Löschen Sie den umbenannten Tabellentyp.

EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType';
GO
CREATE TYPE dbo.MyTableType AS TABLE(
    Id INT NOT NULL,
    Name VARCHAR(255) NOT NULL
);
GO
DECLARE @Name NVARCHAR(776);

DECLARE REF_CURSOR CURSOR FOR
SELECT referencing_schema_name + '.' + referencing_entity_name
FROM sys.dm_sql_referencing_entities('dbo.MyTableType', 'TYPE');

OPEN REF_CURSOR;

FETCH NEXT FROM REF_CURSOR INTO @Name;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC sys.sp_refreshsqlmodule @name = @Name;
    FETCH NEXT FROM REF_CURSOR INTO @Name;
END;

CLOSE REF_CURSOR;
DEALLOCATE REF_CURSOR;
GO
DROP TYPE dbo.zMyTableType;
GO

WARNUNG:

Dies kann sich negativ auf Ihre Datenbank auswirken. Daher sollten Sie dies zunächst in einer Entwicklungsumgebung testen.

33
norlando

Hier finden Sie einfache Schritte, die den Zeitaufwand minimieren und keine fehleranfälligen halbautomatischen Skripts oder teuren Tools erfordern.

Beachten Sie, dass Sie DROP/CREATE-Anweisungen für mehrere Objekte im Fenster "Details" des Objekt-Explorers generieren können (bei dieser Generierung werden DROP- und CREATE-Skripte gruppiert, wodurch das Einfügen von Logik zwischen Drop- und Create-Aktionen vereinfacht wird):

Drop and Create To

  1. Sichern Sie Ihre Datenbank für den Fall, dass etwas schief geht!
  2. Generieren Sie automatisch die DROP/CREATE-Anweisungen für alle Abhängigkeiten (oder generieren Sie sie für alle "Programmierbarkeit" -Objekte, um das langwierige Auffinden von Abhängigkeiten zu vermeiden).
  3. Fügen Sie zwischen den Anweisungen DROP und CREATE [Abhängigkeiten] (nach DROP und vor CREATE) die generierten Anweisungen DROP/CREATE [Tabellentyp] ein, und nehmen Sie die Änderungen vor, die Sie mit CREATE TYPE benötigen.
  4. Führen Sie das Skript aus, das alle Abhängigkeiten/UDTTs löscht und dann [UDTTs mit Änderungen]/Abhängigkeiten neu erstellt.

Wenn Sie kleinere Projekte haben, bei denen es möglicherweise sinnvoll ist, die Infrastrukturarchitektur zu ändern, sollten Sie benutzerdefinierte Tabellentypen entfernen. Mit Entity Framework und ähnlichen Tools können Sie die meisten, wenn nicht alle Ihrer Datenlogiken in Ihre Codebasis verschieben, wo die Wartung einfacher ist.

12
Andre Light

Wenn Sie ein Datenbankprojekt in Visual Studio verwenden können, können Sie Ihre Änderungen im Projekt vornehmen und mithilfe des Schemavergleichs die Änderungen an Ihrer Datenbank synchronisieren.

Auf diese Weise werden die abhängigen Objekte vom Änderungsskript gelöscht und neu erstellt.

5
Simon Zeinstra

sie können Ihren TYP NICHT ÄNDERN/ÄNDERN. Sie müssen die vorhandene Spalte löschen und mit dem richtigen Namen/Datentyp neu erstellen oder eine neue Spalte hinzufügen

3
user2767892

Simon Zeinstra hat die Lösung gefunden!

Aber ich habe Visual Studio Community 2015 verwendet und musste nicht einmal den Schema-Vergleich verwenden.

Mit dem SQL Server-Objekt-Explorer habe ich meinen benutzerdefinierten Tabellentyp in der Datenbank gefunden. Ich habe mit der rechten Maustaste auf den Tabellentyp geklickt und ausgewählt. Dies öffnete eine Code-Registerkarte in der IDE mit dem TSQL-Code sichtbar und editierbar. Ich habe einfach die Definition geändert (in meinem Fall nur die Größe eines nvarchar-Feldes erhöht) und klickte auf die Schaltfläche Datenbank aktualisieren oben links auf der Registerkarte.

Hallo Presto! - Eine schnelle Überprüfung in SSMS und der udtt-Definition wurde geändert.

Genial - danke Simon.

3
BioEcoSS

Sie sollten den alten Tabellentyp löschen und einen neuen erstellen. Wenn es jedoch Abhängigkeiten gibt (gespeicherte Prozeduren, die es verwenden), können Sie es nicht löschen. Ich habe eine weitere Antwort gepostet erläutert, wie der Prozess des vorübergehenden Löschens aller gespeicherten Prozeduren, des Änderns der Tabellentabelle und des anschließenden Wiederherstellens der gespeicherten Prozeduren automatisiert werden kann.

3
BornToCode