Това беше кръстосано публикувано на Администратори на база данни така че бих могъл да публикувам отговора си оттам и тук, за да помогна на бъдещите търсещи.
Може да се направи само като промяна на метаданни (т.е. без мигриране на всички данни към нова таблица) с помощта на ALTER TABLE ... SWITCH
.
Примерен код по-долу
/*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;
ПРЕДУПРЕЖДЕНИЕ:когато вашата таблица съдържа колона IDENTITY, трябва да поставите отново стойността на IDENTITY. SWITCH TO ще нулира началната стойност на колоната за самоличност и ако нямате ограничение UNIQUE или PRIMARY KEY за самоличността (напр. когато използвате индекс CLUSTERED COLUMNSTORE в SQL 2014) няма да го забележите веднага. Трябва да използвате DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]), за да зададете отново правилно началната стойност.