Wie kann ich einen benutzerdefinierten Tabellentyp in SQL Server ändern?
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.
sp_rename
Um den Tabellentyp umzubenennen, füge ich normalerweise nur z am Anfang des Namens hinzu.sp_refreshsqlmodule
drauf.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.
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):
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.
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.
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
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.
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.