sql >> Databáze >  >> RDS >> Sqlserver

Aktualizujte možnost ANSI_NULLS v existující tabulce

Toto bylo kříž zveřejněno na správcích databází takže bych zde také mohl zveřejnit svou odpověď, abych pomohl budoucím hledajícím.

Lze to provést pouze jako změnu metadat (tj. bez migrace všech dat do nové tabulky) pomocí ALTER TABLE ... SWITCH .

Příklad kódu níže

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

VAROVÁNÍ:Pokud vaše tabulka obsahuje sloupec IDENTITY, musíte znovu nasadit hodnotu IDENTITY. Přepínač SWITCH TO resetuje počáteční hodnotu sloupce identity a pokud nemáte omezení UNIQUE nebo PRIMARY KEY pro identitu (např. při použití indexu CLUSTERED COLUMNSTORE v SQL 2014) si toho hned nevšimnete. Abyste znovu správně nastavili hodnotu seed, musíte použít DBCC CHECKIDENT ('dbo.YourTable', RESEED, [hodnota reseed]).



  1. MySQL - Je možné získat všechny podpoložky v hierarchii?

  2. Dotaz Mysql k určení, zda je daný datetime zahrnut do intervalu datetime

  3. nejlepší nákupní košíky elektronického obchodu pro vývojáře Zend Framework

  4. Jak zajistit pořadí výsledků dotazu MYSQL ORDER BY podmínek?