Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Актуализирайте опцията ANSI_NULLS в съществуваща таблица

Това беше кръстосано публикувано на Администратори на база данни така че бих могъл да публикувам отговора си оттам и тук, за да помогна на бъдещите търсещи.

Може да се направи само като промяна на метаданни (т.е. без мигриране на всички данни към нова таблица) с помощта на ALTER TABLE ... SWITCH .

Примерен код по-долу

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

ПРЕДУПРЕЖДЕНИЕ:когато вашата таблица съдържа колона IDENTITY, трябва да поставите отново стойността на IDENTITY. SWITCH TO ще нулира началната стойност на колоната за самоличност и ако нямате ограничение UNIQUE или PRIMARY KEY за самоличността (напр. когато използвате индекс CLUSTERED COLUMNSTORE в SQL 2014) няма да го забележите веднага. Трябва да използвате DBCC CHECKIDENT ('dbo.YourTable', RESEED, [reseed value]), за да зададете отново правилно началната стойност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL WHERE клауза, съответстваща на стойности с крайни интервали

  2. Как да използвам регулярен израз в sql сървър?

  3. Може ли някой да обясни разликата между две заявки?

  4. Основната файлова група е пълна в SQL Server 2008 Standard без видима причина

  5. Вмъкване на SQL Server, ако не съществува, най-добрата практика