更改表上的 ANSI_NULLS 设置

Mah*_* KP 8 sql-server-2008

我们可以使用以下查询来更新 ANSI_NULLS 选项吗?

sp_configure 'allow updates', 1

reconfigure with override

update sysobjects set status = status | 0x20000000 where name = 'tblClient'
Run Code Online (Sandbox Code Playgroud)

我不确定它在做什么。我在寻找解决方案后得到了这个。我们的数据库是 SQL Server 2008。

但是当我运行这个时,我遇到了这样的错误 "Ad hoc updates to system catalogs are not allowed."

请提出您的建议

Mar*_*ith 10

直接更新系统表不受支持且不安全。它们的结构自 2000 年以来发生了变化,因此您的代码无论如何都不会对它们起作用。

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; 
Run Code Online (Sandbox Code Playgroud)

然而,一个警告是这并不总是有效。添加带有定义的检查约束CHECK (X <> NULL)会导致它失败

ALTER TABLE SWITCH 语句失败。表 'YourTableNew'在列 'X' 上有一个列级检查约束 'CK_ YourTableNew _X__37A5467C',该约束不可加载用于语义验证。

这是有道理的,因为约束的语义会随着设置而变化。

如果您遇到这种情况,您可以考虑暂时删除有问题的约束等,并在切换后将它们添加回来,或者只是硬着头皮以更传统的方式重新创建表。