更新现有表中的ANSI_NULLS选项

Mah*_* KP 13 sql clustered-index sql-server-2008 ansi-nulls

在我们的数据库中有一个用它创建的表ANSI_NULLS OFF.现在我们使用此表创建了一个视图.我们想为此视图添加聚簇索引.

在创建聚簇索引时,它显示的错误就像无法创建索引一样,因为ANSI_NULL对于此特定表是关闭的.

该表包含大量数据.所以我想将此选项更改为ON而不会丢失任何数据.

有没有办法改变表来修改这个选项.请提出你的建议.

Mar*_*ith 18

这是在数据库管理员上交叉发布的,所以我也可以在这里发布我的答案,以帮助未来的搜索者.

它可以作为仅元数据更改(即不将所有数据迁移到新表)使用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)

警告:当您的表包含IDENTITY列时,您需要重新设置IDENTITY值.SWITCH TO将重置标识列的种子,如果您对标识没有UNIQUE或PRIMARY KEY约束(例如,在SQL 2014中使用CLUSTERED COLUMNSTORE索引时),您将不会立即注意到它.您需要使用DBCC CHECKIDENT('dbo.YourTable',RESEED,[reseed value])来再次正确设置种子值.