2016-08-05 20 views
-2

So zu machen, wenn ich so etwas wieIst es möglich, eine Transaktion ignorieren

CREATE TABLE FakeTable (NotNullColumn INT NOT NULL); 
INSERT INTO FakeTable (NotNullColumn) VALUES (NULL); 

haben dann natürlich bekomme ich einen Fehler

kann nicht den Wert NULL in Spalte einfügen ‚NotNullColumn‘, Tabelle ' Merchant_BizarroNordstrom.dbo.FakeTable '; Spalte erlaubt Nullen nicht. INSERT schlägt fehl.

Ich frage mich, ob es einen Weg gibt, um vorübergehend, das heißt im Rahmen einer Transaktion, machen es so, dass NULL in eine Säule mit einem NOT NULL Einschränkung ergibt nichts Einfügen eher als ein Fehler passiert.

Wenn Sie neugierig sind, was mein wirkliches Problem ist, gibt es eine riesige Abfrage, die ich nicht stundenlang lesen und debuggen möchte und deshalb möchte ich eine schnelle Lösung anwenden.

+0

Können Sie eine temporäre Tabelle verwenden, anstatt direkt zur physischen Tabelle zu wechseln? – mrtig

+1

Die Bedingung "NOT NULL" kann aus einem bestimmten Grund vorhanden sein, z. aufgrund der Referenzintegrität. Bist du sicher, dass es klug ist, hier herumzuhacken? –

+0

Dies ist die zweite schlecht dokumentierte und erklärte Frage von einem einzelnen Benutzer in wenigen Stunden. Ich würde empfehlen, es als Missbrauch zu melden und zu Fragen überzugehen, die die SO-Community nicht beleidigen. –

Antwort

4

Verwenden try..catch Blöcke

So etwas ....

BEGIN TRY 
    BEGIN TRANSACTION 
     INSERT INTO FakeTable (NotNullColumn) VALUES (NULL); 
    COMMIT TRANSACTION 
END TRY 

BEGIN CATCH 
    IF (@@TRANCOUNT > 0) 
     ROLLBACK TRANSACTION 
    PRINT 'Do something or nothing here' 

END CATCH 

Mit try..catch Block gibt Ihnen die Kontrolle über, wenn der Fehler ausgelöst wird, wenn etwas schief geht.

Im Try-Block, weil der Nullwert nicht eingefügt werden kann, springt das Steuerelement zum Catch-Block, dort können Sie explizit einen Fehler auslösen oder nichts tun.

EDIT

Nach der Lektüre Ihren Kommentar Ich denke, benötigen Sie einen Anstatt Trigger einfügen. Etwas wie ...

Der Trigger wird anstelle der tatsächlichen Insert-Anweisung ausgelöst, und nur die Nicht-Null-Werte werden eingefügt.

+0

Aber ich möchte nichts nur für die Null-Einfügungen tun. Wenn ich zum Beispiel 'INSERT INTO FakeTable (NotNullColumn) VALUES (NULL, 5);' hätte, möchte ich immer noch 5 einfügen. –

-1

Aber ich möchte nichts nur für die Null-Einfügungen tun. Zum Beispiel, wenn Ich hatte INSERT INTO FakeTable (NotNullColumn) VALUES (NULL, 5); dann möchte ich 0 noch 5 eingefügt.

INSERT INTO FakeTable (NotNullColumn, othercolumn) VALUES (ISNULL(@VAL_THAT_MIGHT_BE_NULL,''), 5); 

dies Ihrer erf kümmern. Natürlich versteht es sich, dass ein NULL-Wert in eine leere Zeichenfolge konvertiert wird und dass Ihre Anwendung damit umgehen muss. Wenn Ihre Anwendung keine leere Zeichenfolge erwartet, wird dies nicht funktionieren.

+1

guys Bitte zögern Sie nicht die downvotes zu erklären .... so dass ich die Antwort verbessern/entfernen kann. Thx – objectNotFound

+0

Ich denke, Sie haben die Frage von OP missverstanden. Zu Ihrer Verteidigung ist der Kommentar von OP, den Sie zitiert haben, sehr irreführend. Was OP sagen wollte, war: * Wenn ich die folgenden 2 insert Anweisungen hätte: in falseTable (null) einfügen; Einfügen in fakeTable (5); Anstatt einen Fehler bei der ersten Einfügung zu erhalten, möchte ich nur, dass sie ignoriert wird, damit die zweite Anweisung erfolgreich ist. * Hoffe, dass sie aufhört. Dann wieder könnte ich mich auch irren :) – sstan

+1

@ststan lol macht Sinn, aber ich werde auf das OP warten, um zu zeigen und zu erklären ... thx – objectNotFound