Wie kann ich einen benutzerdefinierten Tabellentyp in SQL Server ändern?
Wie kann ich einen benutzerdefinierten Tabellentyp in SQL Server ändern?
Antworten:
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
Credits an jkrajes
Wie pro Msdn ist es wie ‚Die benutzerdefinierte Tabellentypdefinition nicht geändert werden kann , nachdem es erstellt wird‘.
Dies ist eine Art Hack, scheint aber zu funktionieren. Im Folgenden finden Sie die Schritte und ein Beispiel zum Ändern eines Tabellentyps. Ein Hinweis ist, dass das sp_refreshsql-Modul fehlschlägt, wenn die Änderung, die Sie am Tabellentyp vorgenommen haben, eine wichtige Änderung an diesem Objekt ist, normalerweise eine Prozedur.
sp_rename
den Tabellentyp umbenennen, ich in der Regel nur hinzufügen , z an den Anfang des Namens.sp_refreshsqlmodule
sie aus.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 nachteilig auf Ihre Datenbank auswirken. Sie sollten dies daher zunächst in einer Entwicklungsumgebung testen.
sp_refreshsqlmodle
nach dem Neuerstellen des Tabellentyps nicht auf Ihrem Store-Proc ausgeführt werden, schlägt der gespeicherte Proc fehl, dass der Tabellentyp geändert wurde. Ich empfehle, dies auf einer Entwicklungsversion Ihrer Datenbank auszuführen, bevor Sie es in der Produktion ausführen.
sp_rename
auf benutzerdefinierten Datentyp werfen Sie mir einen Fehler: Either the parameter @objname is ambiguous or the claimed @objtype ((null)) is wrong.
Was könnte falsch sein?
EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType', 'OBJECT';
. Stellen Sie außerdem sicher, dass Sie das Schema für den ersten Parameter und nicht für den zweiten einschließen.
Hier sind einfache Schritte, die Langeweile minimieren und keine fehleranfälligen halbautomatischen Skripte oder teuren Tools erfordern.
Beachten Sie, dass Sie im Fenster "Objekt-Explorer-Details" DROP / CREATE-Anweisungen für mehrere Objekte 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, in denen es möglicherweise sinnvoll ist, die Infrastrukturarchitektur zu ändern, sollten Sie benutzerdefinierte Tabellentypen entfernen. Mit Entity Framework und ähnlichen Tools können Sie den größten Teil, wenn nicht den gesamten Teil Ihrer Datenlogik in Ihre Codebasis verschieben, wo die Wartung einfacher ist.
Simon Zeinstra hat die Lösung gefunden!
Aber ich habe Visual Studio Community 2015 verwendet und musste nicht einmal Schemavergleich verwenden.
Mit SQL Server Object Explorer habe ich meinen benutzerdefinierten Tabellentyp in der Datenbank gefunden. Ich habe mit der rechten Maustaste auf den Tabellentyp geklickt und ausgewählt. Dadurch wurde eine Code-Registerkarte in der IDE geöffnet, in der der TSQL-Code sichtbar und bearbeitbar war . Ich habe einfach die Definition geändert (in meinem Fall nur ein nvarchar-Feld vergrößert) und oben links auf der Registerkarte auf die Schaltfläche Datenbank aktualisieren geklickt .
Hey Presto! - Eine schnelle Überprüfung in SSMS und die udtt-Definition wurde geändert.
Genial - danke Simon.
Wenn Sie ein Datenbankprojekt in Visual Studio verwenden können, können Sie Ihre Änderungen im Projekt vornehmen und den Schemavergleich verwenden, um die Änderungen mit Ihrer Datenbank zu synchronisieren.
Auf diese Weise wird das Löschen und Neuerstellen der abhängigen Objekte vom Änderungsskript behandelt.
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 veröffentlicht, wie der Prozess des temporären Löschens aller gespeicherten Prozeduren, des Änderns der Tabellentabelle und des anschließenden Wiederherstellens der gespeicherten Prozeduren automatisiert werden kann.
Sie können Ihren Typ nicht ändern / ändern. Sie müssen das vorhandene löschen und mit dem richtigen Namen / Datentyp neu erstellen oder eine neue Spalte hinzufügen