Fehler bei der Konvertierung beim konvertieren den varchar-Wert in int

Microsoft SQL Server 2008 (SP1), eine unerwartete "Konvertierung fehlgeschlagen" - Fehler.

Nicht ganz sicher, wie Sie Sie beschreiben dieses problem, also unten ist ein einfaches Beispiel. Der CTE extrahiert, der numerische Teil bestimmte IDs mit einer Suchbedingung, um sicherzustellen, einen numerischen Teil tatsächlich existiert. Die CTE wird dann verwendet, um zu finden, die niedrigsten nicht verwendeten Sequenz-Nummer (ähnlich):

CREATE TABLE IDs (ID CHAR(3) NOT NULL UNIQUE);

INSERT INTO IDs (ID) VALUES ('A01'), ('A02'), ('A04'), ('ERR');

WITH ValidIDs (ID, seq)
AS 
(
 SELECT ID, CAST(RIGHT(ID, 2) AS INTEGER)
   FROM IDs 
  WHERE ID LIKE 'A[0-9][0-9]'
)
SELECT MIN(V1.seq) + 1 AS next_seq
  FROM ValidIDs AS V1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM ValidIDs AS V2
                    WHERE V2.seq = V1.seq + 1
                  );

Den Fehler, 'Fehler bei der Konvertierung beim konvertieren den varchar-Wert 'RR' in den int-Datentyp.'

Ich kann nicht verstehen, warum der Wert ID = 'ERR' sollte erwogen wird für die Umwandlung, weil das Prädikat ID LIKE 'A[0-9][0-9]' sollte entfernt haben, die ungültige Zeile aus dem resultset.

Wenn die Basis-Tabelle wird ersetzt durch eine gleichwertige, CTE, das problem geht Weg, d.h.

WITH IDs (ID)
AS
(
 SELECT 'A01'
 UNION ALL 
 SELECT 'A02'
 UNION ALL 
 SELECT 'A04'
 UNION ALL 
 SELECT 'ERR' 
),
ValidIDs (ID, seq)
AS 
(
 SELECT ID, CAST(RIGHT(ID, 2) AS INTEGER)
   FROM IDs 
  WHERE ID LIKE 'A[0-9][0-9]'
)
SELECT MIN(V1.seq) + 1 AS next_seq
  FROM ValidIDs AS V1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM ValidIDs AS V2
                    WHERE V2.seq = V1.seq + 1
                  );

Warum würde eine Basistabelle, die diesen Fehler verursachen? Ist das ein bekanntes Problem?


UPDATE @sgmoore: Nein, dabei wird die Filterung in einer CTE und der Umwandlung in eine andere CTE führt immer noch in die gleichen Fehler z.B.

WITH FilteredIDs (ID)
AS 
(
 SELECT ID
   FROM IDs 
  WHERE ID LIKE 'A[0-9][0-9]'

), 
ValidIDs (ID, seq)
AS 
(
 SELECT ID, CAST(RIGHT(ID, 2) AS INTEGER)
   FROM FilteredIDs 
)
SELECT MIN(V1.seq) + 1 AS next_seq
  FROM ValidIDs AS V1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM ValidIDs AS V2
                    WHERE V2.seq = V1.seq + 1
                  );
  • Der Kern CTE funktioniert - versuchen Sie es mit SELECT * FROM ValidIDs statt der Abfrage. Der Fehler muss irgendwo anders sein...
  • Ich Stimme den Allgemeinen Tabellenausdruck ist nicht die Quelle des Problems. Ich bin mir nicht sicher, wie Allgemeine Tabellenausdrücke arbeiten unter der Decke, aber ich erwarte, dass der CTE die Abfrage wird lediglich erweitert in die Abfrage auf analysieren mal. In der Tat, re-schreiben der Abfrage mit zwei abgeleiteten Tabellen (jeweils mit der gleichen syntax natürlich) noch Exponate das problem.
InformationsquelleAutor onedaywhen | 2010-05-04
Schreibe einen Kommentar