Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aktualisieren Sie die ANSI_NULLS-Option in einer vorhandenen Tabelle

Dies wurde cross-posted on Database Administrators Daher kann ich meine Antwort von dort auch hier posten, um zukünftigen Suchenden zu helfen.

Dies kann mit ALTER TABLE ... SWITCH als reine Metadatenänderung (d. h. ohne Migration aller Daten in eine neue Tabelle) erfolgen .

Beispielcode unten

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

WARNUNG:Wenn Ihre Tabelle eine IDENTITY-Spalte enthält, müssen Sie den IDENTITY-Wert neu setzen. Der SWITCH TO setzt den Seed der Identitätsspalte zurück, und wenn Sie keine UNIQUE- oder PRIMARY KEY-Einschränkung für die Identität haben (z. B. wenn Sie den CLUSTERED COLUMNSTORE-Index verwenden). in SQL 2014) werden Sie es nicht sofort bemerken. Sie müssen DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]) verwenden, um den Seed-Wert wieder korrekt festzulegen.