2012-11-02 6 views
8

Eine SAMPLE Tabelle enthält nur eine Spalte ID vom Typ int, default null.Leere Zeichenfolge in INT-Spalte für SQL Server einfügen

In Oracle, wenn ich tun:

insert into SAMPLE (ID) values (''); 

der neue Datensatz wird mit Blindwert hinzugefügt. Aber in SQL Server 2008, wenn ich die gleiche insert Anweisung ausführen, hat der neue Datensatz den Wert 0.

Gibt es eine Möglichkeit, SQL Server 2008 zu zwingen, leere Zeichenfolge auf Null anstelle von 0 (für den numerischen Typ von Säulen)?

Antwort

5

Verwenden Sie stattdessen NULL.

insert into SAMPLE (ID) values (NULL); 
+0

Ich weiß, dass der NULL funktioniert. Aber ich muss eine Menge Code ändern, was perfekt mit Oracle funktioniert, ganz zu schweigen von einer Menge Tests. :( – user1793297

+4

Ich glaube nicht, dass Sie dies tun können, ohne Ihren Code zu ändern. Ich weiß von keiner Einstellung, die SQL Server leeren String als null behandeln. –

0

Sie können keine 'Zeichenfolge' in eine int-Spalte einfügen. Oracle muss das nur für dich erledigen.

Versuchen Sie einfach, NULL einzufügen, wenn Sie das brauchen.

insert into SAMPLE (ID) values (NULL); 
+0

einfügen in SAMPLE (ID) Werte ('5'); Ich bekomme ID = 5, Oracle und SQL Server machen das gleiche fügen Sie in SAMPLE (ID) Werte (''); Ich bekomme ID = 0 für SQL Server und '' für Oracle – user1793297

+0

In Oracle leere Strings und 'Null' sind synonym ich glaube –

0

Eine weitere Option

insert into SAMPLE (ID) values (DEFAULT) 
3

Wie wäre es eine andere Idee - eine INSTEAD OF INSERT Trigger definieren.

Trotz der Tatsache, dass Sie versuchen, eine Zeichenfolge einzufügen, mit dieser wird die Operation "abgefangen", leere Zeichenfolge durch NULL ersetzt, und die Einfügung ist erfolgreich.

Wenn Sie diesen Trigger für Ihre Tabelle definieren, können Sie wie bisher ohne weitere Änderungen eine leere Zeichenfolge einfügen.

Bearbeiten: Wie Martin Smith darauf hinweist, ist dies effektiv ein Vergleich mit 0 (das Äquivalent von leeren String als Int), was bedeutet, dass Sie 0 in dieser Tabelle nicht speichern können. Ich lasse diese Antwort hier für den Fall, dass das für Ihre Situation akzeptabel ist - entweder das oder alle Ihre Fragen wiederholen!

CREATE TRIGGER EmptyStringTrigger 
ON [SAMPLE] 
INSTEAD OF INSERT 
AS 
    BEGIN 
     INSERT INTO [SAMPLE](ID) 
     SELECT CASE 
       WHEN ID = '' THEN NULL 
       ELSE ID 
      END 
     FROM inserted 
    END 

SQL Fiddle example

+2

Das wird auch alle Nullen in 'NULL' konvertieren.Die Umwandlung der leeren Zeichenfolge in null erfolgt zuerst, so dass "ID" in "inserted" der richtige Datentyp ist, dann führt Ihr Vergleich "WHEN ID =" THEN NULL eine weitere implizite Umwandlung von "" auf "0" für die Zeichenfolge aus wörtlich dort, also machen Sie effektiv 'WENN ID = 0 THEN NULL' –

+0

@MartinSmith Guter Punkt, hatte ich nicht bemerkt, dass. Ich denke nicht daran. Ich werde diese Antwort hier lassen, falls dies für die Situation von OP überhaupt akzeptabel ist. – Bridge

+0

@MartinSmith Ich habe bearbeitet, um Ihren Punkt zu enthalten. Und da wunderte ich mich, warum niemand sonst es vorgeschlagen hatte, wenn es so einfach war! Danke für deine wertvollen Einblicke wie immer. – Bridge

4

Unter der Annahme, dass Ihre INSERT-Anweisung ist an vielen Stellen der Anwendung Teil einer gespeicherten Prozedur wiederverwendet (oder vielleicht ist ein Batch immer mit dem gleichen Teil des Client-Code aufgebaut) und dass der eingefügte Wert eine Zahl ist, die als String-Argument übergeben wird, könnten Sie das INSERT wie folgt ändern:

INSERT INTO SAMPLE (ID) VALUES (NULLIF(@argument, ''));