2017-10-27 3 views
0

Wir in einigem Legacy-SQL Server 2005-Code wieWas Auswahlabfrage SQL Server 2005 erwartetes Verhalten des Einsatzes in der Tabelle ist, wo eine der Spalten versucht einen Nullwert

insert into myTable 
select distinct 
    wherefield1, 
    wherefield2, 
    anotherfield, 
    convert(numeric(10,2), varcharfield1), 
    convert(numeric(10,2), varcharfield2), 
    convert(numeric(10,2), varcharfield3), 
    convert(datetime, varcharfield4), 
    otherfields 
from myStagingTable 
where insertflag='true' 
and wherefield1 = @wherevalue1 
and wherefield2 = @wherevalue2 

Früher in dem Code eine Erklärung zu konvertieren Eine Variable wird gesetzt, um zu bestimmen, ob varcharfield1 oder varcharfield2 null ist, und die Einfügung ist so programmiert, dass sie ausgeführt wird, solange eine von ihnen nicht null ist.

Wir wissen, dass, wenn varcharfield1, varcharfield2 oder varcharfield3 eine nicht numerische Zeichenfolge ist, eine Ausnahme ausgelöst wird und die Einfügung nicht erfolgt. Aber ich bin perplex über das Verhalten, wenn eine dieser Variablen null ist, wie es oft ist. Tatsächlich ist es immer der Fall, dass einer dieser Werte null ist. Aber es scheint, dass die Einfügung stattfindet. Es sieht so aus, als ob der Legacy-Code darauf angewiesen ist, nur das Einfügen nicht numerischer Zeichendaten zu verhindern, während das Einfügen von Null- oder Leerwerten zulässig ist (in einem früheren Schritt wurden alle leeren Strings in diesen Feldern von myStagingTable durch Nullwerte ersetzt).

Dies wurde auf einer Produktion SQL Server 2005-Instanz mit allen Standardeinstellungen für eine Anzahl von Jahren ausgeführt. Können wir uns auf dieses Verhalten verlassen, wenn wir auf eine neuere Version von SQL Server aktualisieren?

Danke,

Rebeccah

Antwort

1

Umwandlung von NULL zu irgendetwas ist NULL noch. Wenn die Spalte NULL erlaubt, werden Sie das bekommen. Wenn die Spalte nicht nullfähig ist, schlägt sie fehl.

Sie können dies selbst sehen, ohne einen INSERT zu machen. Führen Sie einfach diese:

SELECT CONVERT(numeric(10,2), NULL) 

und beachten Sie, wie es ein NULL Ergebnis erzeugt. Dann folgt ausführen:

SELECT CONVERT(numeric(10,2), 'x') 

und beachten Sie, wie es eine Fehlermeldung führt, anstatt etwas zurückzugeben.

+0

Sie haben natürlich Recht. Die versuchte Konvertierung von Nullen wurde von einem Kollegen als Ursache für eine Reihe von Fehlerprotokolleinträgen vorgeschlagen, die jedoch durch die versuchte Konvertierung nicht numerischer Zeichenfolgen verursacht wurden. Erst später wurde mir klar, dass der Autor des Codes leere Werte speziell in Nullen umgewandelt hatte, um Fehler zu vermeiden, und ließ den Umwandlungsfehler für nicht numerische Zeichenfolgen unberücksichtigt, um das Einfügen und die Überprüfung der Daten durch menschliche Augäpfel zu erzwingen. – Rebeccah

Verwandte Themen