Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zaktualizuj opcję ANSI_NULLS w istniejącej tabeli

To było opublikowane na Administratorach baz danych więc równie dobrze mogę stąd opublikować moją odpowiedź, aby pomóc przyszłym wyszukiwarkom.

Można to zrobić tylko jako zmianę metadanych (tj. bez migracji wszystkich danych do nowej tabeli) za pomocą ALTER TABLE ... SWITCH .

Przykładowy kod poniżej

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

OSTRZEŻENIE:jeśli twoja tabela zawiera kolumnę IDENTITY, musisz ponownie umieścić wartość IDENTITY. PRZEŁĄCZNIK NA zresetuje ziarno kolumny tożsamości i jeśli nie masz ograniczenia UNIQUE lub PRIMARY KEY dla tożsamości (np. podczas korzystania z indeksu CLUSTERED COLUMNSTORE w SQL 2014) nie zauważysz tego od razu. Musisz użyć DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]), aby ponownie poprawnie ustawić wartość seed.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak użyć pola obliczeniowego w innym polu tego samego zapytania

  2. Zapytanie działa szybko w Query Analyzer, ale wolno w aplikacji C#

  3. Zaplanuj zadanie SQL w skonfigurowanych przez użytkownika przedziałach czasowych codziennie

  4. SQL Server 2008 dzieli, sortuje i łączy wartości

  5. Jak utworzyć tabelę na podstawie innej tabeli?