sql >> Base de Datos >  >> RDS >> Sqlserver

Actualizar la opción ANSI_NULLS en una tabla existente

Esto fue publicación cruzada en los administradores de bases de datos así que también podría publicar mi respuesta desde allí para ayudar a futuros buscadores.

Se puede hacer como un cambio de metadatos solamente (es decir, sin migrar todos los datos a una nueva tabla) usando ALTER TABLE ... SWITCH .

Código de ejemplo a continuación

/*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; 

ADVERTENCIA:cuando su tabla contiene una columna de IDENTIDAD, debe restablecer el valor de IDENTIDAD. El CAMBIO A restablecerá la inicialización de la columna de identidad y, si no tiene una restricción de CLAVE PRIMARIA o ÚNICA en la identidad (por ejemplo, cuando usa el índice ALMACÉN DE COLUMNAS AGRUPADA en SQL 2014) no lo notará de inmediato. Debe usar DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]) para establecer correctamente el valor inicial nuevamente.