3 Stimmen

Warum wird TestID nicht in INT umgewandelt?

Dev's und DBA's, ich glaube, ich habe einen Fehler in SQL 2008 R2 gefunden, es sei denn, einer von Ihnen kann das unten erklären. Können Sie bitte erklären, warum TestID in diesem Szenario anstelle von INT in NUMERIC umgewandelt wird? Bitte beachten Sie, dass dies nur ein Beispiel ist, um das Problem zu zeigen, auf das ich gestoßen bin, während ich etwas Größeres ausprobiert habe, wie z.B. ein Automatisierungsskript, das Daten konvertiert, die aus Excel oder Notepad importiert wurden und die nvarchar/float zu den entsprechenden Datentypen int, numeric, datetime, varchar konvertieren wird.

CREATE TABLE #KorrupteDaten(
TestID VARCHAR(100)
 );

 GO

INSERT INTO #KorrupteDaten
VALUES ('1'),
   ('2');

SELECT 
     CASE
        WHEN TestID LIKE '[1-9]%' AND TestID NOT LIKE '0%' THEN CAST(TestID AS INT) 
        WHEN TestID LIKE '0%'  THEN CAST(TestID AS NUMERIC(12,2))
   END AS TestID

 INTO #FesteDaten
 FROM #KorrupteDaten

SELECT  *
FROM    #FesteDaten

1voto

Louie Bao Punkte 1612

Ihre 1 und 2 wurden aufgrund der Art und Weise, wie ein CASE-Statement den Typ zurückgibt, in Dezimalzahlen umgewandelt:

CASE

Ergebnistypen: Gibt den Typ mit der höchsten Präzedenz aus der Menge der Typen in result_expressions und dem optionalen else_result_expression zurück. Weitere Informationen finden Sie unter Datentyppräzedenz.

Lesen Sie die vollständige Dokumentation: http://technet.microsoft.com/en-us/library/ms181765(v=sql.105).aspx

Wenn Sie wirklich INT sehen möchten, wandeln Sie einfach alles, was vom CASE-Statement zurückgegeben wird, in INT um:

CAST(CASE
    WHEN TestID LIKE '[1-9]%' AND TestID NOT LIKE '0%' THEN CAST(TestID AS INT) 
    WHEN TestID LIKE '0%'  THEN CAST(TestID AS NUMERIC(12,2))
END AS INT) AS TestID

0voto

Stoleg Punkte 8529

Normalerweise, wenn Sie mit inkorrekten oder korrupten Daten arbeiten, sollten Sie so wenig Annahmen wie möglich darüber treffen und dem Benutzer, der solche Daten überprüft und ändert, entscheiden lassen, was es ist.

Auch wie @Louie Bao sagte, können Sie nicht dieselbe Spalte in zwei oder mehr Datentypen haben. Sie müssen nur einen auswählen. Da Sie numerische Werte beibehalten müssen, sollte Ihre Spalte NUMERIC[] sein.

Ihre Optionen sind also:

  • Lassen Sie es als VARCHAR
  • Legen Sie die Daten in 2 verschiedenen Spalten INT und Numeric[]
  • Haben Sie eine einzelne NUMERIC Spalte, aber konvertieren Sie Zahlen ohne Dezimalstelle für Anzeigezwecke in VARCHAR() so aus, als wären sie ganzzahlig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X