これはcross posted on Database Administratorsだったので、将来の検索ユーザーを支援するために私の回答も掲載しています。
ALTER TABLE ... SWITCH
を使用してメタデータのみを変更する(つまり、すべてのデータを新しいテーブルに移行することなく)ことができます。あなたのテーブルを使用すると、IDENTITY値を再シードする必要がIDENTITY列を含む:サンプルコード
/*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;
WARNING以下
。 SWITCH TOはID列のシードをリセットし、IDにUNIQUEまたはPRIMARY KEY制約がない場合(SQL 2014でCLUSTERED COLUMNSTOREインデックスを使用する場合など)、すぐには気づかないでしょう。 シード値を正しく設定するには、DBCC CHECKIDENT( 'dbo.YourTable'、RESEED、[reseed value])を使用する必要があります。
これは元のテーブルのすべてのインデックスと制約を保持しますか? –
いいえ、すべてのインデックスと制約が保持されません。 – xav
@xav 'create table'にそれらを含めるとします。 –