Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Atualizar opção ANSI_NULLS em uma tabela existente


Isso foi cruzado em administradores de banco de dados então eu também posso postar minha resposta de lá também para ajudar futuros pesquisadores.

Isso pode ser feito apenas como uma alteração de metadados (ou seja, sem migrar todos os dados para uma nova tabela) usando ALTER TABLE ... SWITCH .

Código de exemplo abaixo
/*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; 

AVISO:quando sua tabela contém uma coluna IDENTITY, você precisa propagar novamente o valor IDENTITY.O SWITCH TO redefinirá a semente da coluna identity e se você não tiver uma restrição UNIQUE ou PRIMARY KEY na identidade (por exemplo, ao usar o índice CLUSTERED COLUMNSTORE no SQL 2014) você não notará imediatamente. Você precisa usar DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]) para definir corretamente o valor de semente novamente.