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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es ein bug und bereits gemeldet wurden als SQL Server sollte nicht zu erhöhen unlogische Fehler (wie gesagt, es ist schwer zu beschreiben, dieser!) von Erland Sommarskog.
Die Antwort von der SQL Server-Programmierbarkeit-Team ist, "das Problem ist, dass SQL Server löst Fehler aus [zu] eifrig durch drücken der prediates/Ausdrücke während der Ausführung der Abfrage ohne Berücksichtigung der logischen Ergebnis der Abfrage."
Habe ich nun stimmten für ein Update, alle tun das gleiche bitte 🙂
Was ist, wenn Sie ersetzen den Abschnitt
Mit
Dies geschah zu mir, denn ich habe eine Union und war nicht darauf achten, stellen Sie sicher, dass beide Anfragen hatten Ihre Felder in der gleichen Reihenfolge. Sobald ich fixiert, dass, es war in Ordnung.