Ändern der ANSI_NULLS-Einstellung für eine Tabelle

7

Können wir die folgende Abfrage verwenden, um die Option ANSI_NULLS zu aktualisieren?

sp_configure 'allow updates', 1

reconfigure with override

update sysobjects set status = status | 0x20000000 where name = 'tblClient'

Ich bin mir nicht sicher, was es tut. Ich habe das bekommen, nachdem ich nach einer Lösung gesucht habe. Unsere Datenbank ist SQL Server 2008.

Aber während ich das laufe, habe ich einen Fehler wie diesen bekommen "Ad hoc updates to system catalogs are not allowed."

Bitte geben Sie Ihre Vorschläge

Mahesh KP
quelle

Antworten:

9

Das direkte Aktualisieren von Systemtabellen wird nicht unterstützt und ist nicht sicher. Ihre Struktur hat sich seit 2000 geändert, sodass der Code, den Sie haben, sowieso nicht gegen sie funktioniert.

Es ist manchmal möglich, dies ALTER TABLE ... SWITCHzu tun, da sich nur Metadaten ändern.

Ein voll funktionsfähiges Beispiel 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; 

Eine Einschränkung ist jedoch, dass dies nicht immer funktioniert. Das Hinzufügen einer Prüfbedingung mit Definition CHECK (X <> NULL)führt dazu, dass sie fehlschlägt

Die Anweisung ALTER TABLE SWITCH ist fehlgeschlagen. Die Tabelle 'YourTableNew' enthält eine Einschränkung für die Überprüfung der Spaltenebene 'CK_ YourTableNew _X__37A5467C' für die Spalte 'X', die für die semantische Validierung nicht geladen werden kann.

Dies ist sinnvoll, da sich die Semantik der Einschränkung mit der Einstellung ändert.

Wenn Sie darauf stoßen, können Sie die problematischen Einschränkungen usw. vorübergehend entfernen und nach dem Wechsel wieder hinzufügen oder einfach in die Kugel beißen und die Tabelle auf konventionellere Weise neu erstellen.

Martin Smith
quelle
1
Vielen Dank. Aber was ist dann mit den Daten in Ihrer Tabelle?
Mahesh KP
@ Mahesh - Das ist immer noch da. Versuchen Sie, SELECT * FROM dbo.YourTableam Ende des Demo-Codes zu laufen . Die Datenseiten bleiben unverändert. Nur die Tabellendefinition wird aktualisiert.
Martin Smith
Wir haben ungefähr 100 Tische, also müssen wir das für alle Tische tun. Gibt es eine Option, um es einfacher zu machen, wie in einer Ein-Schritt-Konfiguration oder einer Methode, um dieses Ding zu automatisieren .. :)
Mahesh KP
@mahesh - Sie könnten es wahrscheinlich mithilfe von SMO automatisieren, um die CREATETabellenanweisung oder TSQL ähnlich wie hier zu skripten . Stellen Sie sicher, dass Sie eine gute Fehlerbehandlung haben!
Martin Smith
Ich erstelle die neue Tabelle, indem ich die Skripttabelle als Option in SSMS für die bestimmte Tabelle verwende. In diesem Fall muss der Name von Einschränkungen wie Primärschlüssel und Fremdschlüssel manuell geändert werden. Ist irgendein anderes Opton, um diese manuelle Bearbeitung loszuwerden ..
Mahesh KP