sql >> Databasteknik >  >> RDS >> Sqlserver

Uppdatera ANSI_NULLS-alternativet i en befintlig tabell

Detta korspostades på databasadministratörer så jag kan lika gärna lägga upp mitt svar därifrån också för att hjälpa framtida sökare.

Det kan göras som enbart metadataändring (dvs utan att migrera all data till en ny tabell) med ALTER TABLE ... SWITCH .

Exempelkod nedan

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

VARNING:när din tabell innehåller en IDENTITY-kolumn måste du se om IDENTITY-värdet. SWITCH TO återställer fröet för identitetskolumnen och om du inte har en UNIK eller PRIMÄR KEY-restriktion på identiteten (t.ex. när du använder CLUSTERED COLUMNSTORE-index i SQL 2014) kommer du inte att märka det direkt. Du måste använda DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]) för att korrekt ställa in startvärdet igen.



  1. Är det möjligt att få flera värden från en underfråga?

  2. Få tabell och kolumn som äger en sekvens

  3. Oracle lägg till aktuellt datum automatiskt

  4. MySQL Trigger för att infoga data i olika DB