To był cross posted on Database Administrators, więc równie dobrze mogę opublikować moją odpowiedź tutaj, aby pomóc przyszłym użytkownikom.
Można to zrobić jako zmianę tylko metadanych (tj. Bez przeniesienia wszystkich danych do nowej tabeli) przy użyciu ALTER TABLE ... SWITCH
.
Przykładowy kod poniżej
/*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;
UWAGA: gdy tabela zawiera kolumny tożsamości trzeba reseedować wartość tożsamości. Przełącznik TO spowoduje zresetowanie materiału siewnego kolumny tożsamości i jeśli nie masz ograniczenia UNIQUE lub PRIMARY KEY na tożsamości (np. Przy użyciu CLUMEROWANEGO indeksu COLUMNSTORE w SQL 2014), nie zauważysz tego od razu. Należy użyć DBCC CHECKIDENT ("dbo.YourTable", RESEED, [reseed value]), aby poprawnie ustawić wartość początkową ponownie.
Czy zachowają one wszystkie indeksy i ograniczenia oryginalnego stołu? –
Nie będzie zachowywał wszystkich indeksów i ograniczeń. – xav
@xav to zrobi, jeśli umieścisz je w 'create table'. –