2016-05-01 22 views
2

Warum die folgende Abfrage in SQL Server 2008 nicht funktioniert?Warum diese Abfrage nicht funktioniert?

SELECT 
    CONVERT(INT, TEMP.observ_value) AS value 
FROM 
    (SELECT observ_value 
    FROM LAB_RESULTS 
    WHERE observ_value NOT LIKE '%[^0-9]%') TEMP 
WHERE 
    observ_value >= 190 

Hier ist der Fehler:

Msg 245, Level 16, State 1, Line 5
Conversion failed when converting the varchar value 'SCREEN' to data type int.

Die observ_value Säule ist varchar. Allerdings habe ich nur die int Werte in der Unterabfrage ausgewählt.

+0

nur FYI, ich die gleiche Abfrage in MSSQL 2012 versucht, es funktioniert. – Guoliang

+0

Beispieldaten anzeigen – Mihai

Antwort

2

Leider können die SQL Server-Abfrage-Optimierer und Elemente aus Ihrer Abfrage in einer Weise neu anordnen, die Fehler eingeführt werden führen können, dass in der ursprünglichen Abfrage nicht da waren. Dies hängt stark von dem genauen Abfrageplan ab, der verwendet wird, der wiederum nicht nur von der Tabellendefinition und dem Abfragetext abhängt, sondern auch davon, wie Ihre Werte verteilt sind.

In Ihrem Fall ist es möglich, dass SQL Server observ_value >= 190 überprüfen wird, implizit observ_value zu int Umwandlung, bevor die observ_value NOT LIKE '%[^0-9]%' überprüfen. Ob dies eine gültige Neuordnung Ihrer Abfrage ist, ist fraglich, aber selbst wenn sie nicht gültig ist, ist es etwas, was SQL Server tut und etwas, woran Sie arbeiten müssen.

Re-schreiben Sie Ihre Abfrage, um sicherzustellen, keine Umwandlung von nicht-numerischen Werten int jemals durchgeführt werden:

SELECT 
    TEMP.observ_value AS value 
FROM 
    (SELECT CASE 
     WHEN observ_value NOT LIKE '%[^0-9]%' 
     THEN CONVERT(INT, observ_value) END 
     AS observ_value 
    FROM LAB_RESULTS 
    WHERE observ_value NOT LIKE '%[^0-9]%') TEMP 
WHERE 
    observ_value >= 190 
+0

Sql-Server ist nicht mysql, es wird einen Fehler für WHERE observ_value> = 190, wenn es nicht numerisch ist – Mihai

+0

@Mihai Ich weiß nicht, wenn Sie meinen, "ob observ_value Datentyp ist nicht numerisch" oder "ob observ_value Wert ist nicht numerisch ". Wenn der erste: SQL Server wird 'varchar' Spalten implizit in' int' konvertieren, und dies ist gut dokumentiert und unterstützt. Wenn letzteres, ja, daher der Fehler der OP, und ich bin den Fehler zu lösen, indem Sie dafür sorgen, dass "observ_value" ist * nie * nicht-numerisch: wenn der ursprüngliche Wert in der Tabelle keine Nicht-Ziffer enthalten, die ' Der CASE-Ausdruck wird als "NULL" ausgewertet, was sicher zu konvertieren ist. – hvd

1

können Sie verwenden ISNUMERIC Funktion

SELECT CONVERT(INT, observ_value) AS value 
    FROM LAB_RESULTS 
    WHERE ISNUMERIC(observ_value)= 1 
+0

Wollen Sie damit den Fehler beheben? Ich verstehe nicht, warum es so wäre, aber ich vermisse etwas. Wenn Sie das nicht sagen, sollte dies ein Kommentar sein. – hvd

Verwandte Themen