Đây là đăng chéo trên Quản trị viên cơ sở dữ liệu vì vậy tôi cũng có thể đăng câu trả lời của mình từ đó ở đây để giúp những người tìm kiếm trong tương lai.
Nó có thể được thực hiện dưới dạng chỉ thay đổi siêu dữ liệu (tức là không di chuyển tất cả dữ liệu sang bảng mới) bằng cách sử dụng ALTER TABLE ... SWITCH
.
Mã mẫu bên dưới
/*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;
CẢNH BÁO:khi bảng của bạn chứa cột IDENTITY, bạn cần phải gửi lại giá trị IDENTITY. SWITCH TO sẽ đặt lại hạt giống của cột danh tính và nếu bạn không có ràng buộc CHÍNH hoặc CHÍNH đối với danh tính (ví dụ:khi sử dụng chỉ mục CLUSTERED COLUMNSTORE trong SQL 2014), bạn sẽ không nhận thấy nó ngay lập tức. Bạn cần sử dụng DBCC CHECKIDENT ('dbo.YourTable', RESEED, [giá trị gửi lại]) để đặt lại giá trị gốc một cách chính xác.