Das direkte Aktualisieren von Systemtabellen wird nicht unterstützt und ist nicht sicher. Ihre Struktur hat sich seit 2000 geändert, sodass der Code, den Sie haben, sowieso nicht gegen sie funktioniert.
Es ist manchmal möglich, dies ALTER TABLE ... SWITCH
zu tun, da sich nur Metadaten ändern.
Ein voll funktionsfähiges Beispiel unten.
/*Create table with option off*/
SET ANSI_NULLS OFF;
CREATE TABLE dbo.YourTable (X INT)
/*Add some data*/
INSERT INTO dbo.YourTable VALUES (1),(2),(3)
/*Confirm the bit is set to 0*/
SELECT uses_ansi_nulls, *
FROM sys.tables
WHERE object_id = object_id('dbo.YourTable')
GO
BEGIN TRY
BEGIN TRANSACTION;
/*Create new table with identical structure but option on*/
SET ANSI_NULLS ON;
CREATE TABLE dbo.YourTableNew (X INT)
/*Metadata only switch*/
ALTER TABLE dbo.YourTable SWITCH TO dbo.YourTableNew;
DROP TABLE dbo.YourTable;
EXECUTE sp_rename N'dbo.YourTableNew', N'YourTable','OBJECT';
/*Confirm the bit is set to 1*/
SELECT uses_ansi_nulls, *
FROM sys.tables
WHERE object_id = object_id('dbo.YourTable')
/*Data still there!*/
SELECT *
FROM dbo.YourTable
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
PRINT ERROR_MESSAGE();
END CATCH;
Eine Einschränkung ist jedoch, dass dies nicht immer funktioniert. Das Hinzufügen einer Prüfbedingung mit Definition CHECK (X <> NULL)
führt dazu, dass sie fehlschlägt
Die Anweisung ALTER TABLE SWITCH ist fehlgeschlagen. Die Tabelle 'YourTableNew' enthält eine Einschränkung für die Überprüfung der Spaltenebene 'CK_ YourTableNew _X__37A5467C' für die Spalte 'X', die für die semantische Validierung nicht geladen werden kann.
Dies ist sinnvoll, da sich die Semantik der Einschränkung mit der Einstellung ändert.
Wenn Sie darauf stoßen, können Sie die problematischen Einschränkungen usw. vorübergehend entfernen und nach dem Wechsel wieder hinzufügen oder einfach in die Kugel beißen und die Tabelle auf konventionellere Weise neu erstellen.