Cập nhật bảng hệ thống trực tiếp là không được hỗ trợ và không an toàn. Cấu trúc của chúng đã thay đổi từ năm 2000, do đó, mã bạn sẽ không hoạt động chống lại chúng.
Tuy nhiên, đôi khi có thể sử dụng ALTER TABLE ... SWITCHđể làm điều này như một siêu dữ liệu chỉ thay đổi.
Một ví dụ đầy đủ làm việc dưới đây.
/*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;
Tuy nhiên, một điều lưu ý là điều này không phải lúc nào cũng hoạt động. Thêm một ràng buộc kiểm tra với định nghĩa CHECK (X <> NULL)làm cho nó thất bại với
Câu lệnh ALTER TABLE SWITCH không thành công. Bảng 'YourTableNew' có ràng buộc kiểm tra mức cột 'CK_ YourTableNew _X__37A5467C' trên cột 'X' không thể tải được để xác thực ngữ nghĩa.
Điều này có ý nghĩa khi ngữ nghĩa của ràng buộc thay đổi với cài đặt.
Nếu bạn gặp phải điều này, bạn có thể xem xét tạm thời loại bỏ các ràng buộc có vấn đề, v.v. và thêm chúng trở lại sau khi chuyển đổi hoặc chỉ cắn viên đạn và tạo lại bảng theo cách thông thường hơn.