Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Mettre à jour l'option ANSI_NULLS dans une table existante

C'était posté croisé sur les administrateurs de base de données donc je pourrais aussi bien poster ma réponse à partir de là aussi pour aider les futurs chercheurs.

Cela peut être fait en tant que changement de métadonnées uniquement (c'est-à-dire sans migrer toutes les données vers une nouvelle table) en utilisant ALTER TABLE ... SWITCH .

Exemple de code ci-dessous

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

AVERTISSEMENT :lorsque votre table contient une colonne IDENTITY, vous devez réamorcer la valeur IDENTITY. SWITCH TO réinitialisera la graine de la colonne d'identité et si vous n'avez pas de contrainte UNIQUE ou PRIMARY KEY sur l'identité (par exemple, lors de l'utilisation de l'index CLUSTERED COLUMNSTORE dans SQL 2014), vous ne le remarquerez pas tout de suite. Vous devez utiliser DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]) pour redéfinir correctement la valeur de départ.