Warum würde ein SELECT INTO einen arithmetischen Überlauf verursachen?

7

Ich mache das

SELECT * INTO table1 FROM Table0

Ich erhalte einen arithmetischen Überlauf für eine datetime-Spalte (Fehler beim Konvertieren in smalldatetime). Das erstellte Zielschema enthält jedoch eine datetime-Spalte und keine smalldatetime-Spalte.

Knitterfrei
quelle

Antworten:

7

Es klingt für mich so, als hätten Sie eine implizite Konvertierung in smalldatetime, wahrscheinlich in einer berechneten Spalte. Wenn Sie sich den geschätzten Ausführungsplan ansehen, sehen Sie dort wahrscheinlich Skalierungsoperationen berechnen. Drücken Sie F4, um die Eigenschaften anzuzeigen, und Sie sollten in der Lage sein, die durchgeführten Berechnungen anzuzeigen, einschließlich aller impliziten Konvertierungen, die verwendet werden.

Rob Farley
quelle
Ja, es gab eine berechnete Spalte. Vielen Dank an alle!
WrinkleFree
1

Diese Art von Problem weist immer auf Korruption hin und kann leicht behoben werden

DBCC CHECKTABLE(<tablename>) WITH DATA_PURITY;

DATA_PURITY
Bewirkt, dass DBCC CHECKTABLE die Tabelle auf Spaltenwerte überprüft, die ungültig sind oder außerhalb des Bereichs liegen. Beispielsweise erkennt DBCC CHECKTABLE Spalten mit Datums- und Zeitwerten, die größer oder kleiner als der zulässige Bereich für den Datetime-Datentyp sind. oder dezimale oder ungefähr numerische Datentypspalten mit ungültigen Skalierungs- oder Genauigkeitswerten.

Remus Rusanu
quelle
Wie bereits erwähnt, handelt es sich um eine berechnete Spalte, die das Problem verursacht hat.
WrinkleFree
Die Tatsache, dass die berechnete Spalte einen Überlauf verursacht, ist technisch gesehen eine Beschädigung und kann durch die Prüfung erkannt werden.
Remus Rusanu
1
@RemusRusanu - Gilt dies nur für persistierte berechnete Spalten? Es wird nichts gemeldet fürCREATE TABLE T(Id int, X AS CAST('Fish' AS INT));INSERT INTO T DEFAULT VALUES;SELECT * INTO #T FROM T;DBCC CHECKTABLE(T) WITH DATA_PURITY;
Martin Smith
@MartinSmith: Sie haben Recht, Datenreinheit überprüft nur das Speicherformat (dh persistierte Spaltenbits auf der Festplatte). Ich war erstaunt darüber, dass Sie die berechnete Spalte erstellen konnten. Offensichtlich hat die DDL den Ausdruck nie ausgewertet, aber beim zweiten Gedanken ist das normal. Die berechnete Spalte hängt normalerweise von den Zeilendaten ab. Während CREATE gibt es keine Zeilen, sodass sie nicht ausgewertet werden können. Während ALTER ... ADD ... könnte es ausgewertet werden, aber es gibt keine 'definierte' Zeile zum Anprobieren, sodass dies eine Überprüfung der Datengröße für alle Zeilen bedeuten würde.
Remus Rusanu
1
Betrachten Sie es als eine Funktion, um ungesunde Verwendung von SELECT *:) zu fangen alter table t add [Thou Shall Not Use *] AS 1/0;.
Remus Rusanu