Dit betekent dat je ten minste één rij in de tabel hebt die niet kan worden gecast naar float
. De CASE
uitvoeren is veilig, maar het combineren van de CTE en het toevoegen van een WHERE-clausule valt in een veelvoorkomende misvatting van programmeurs bij het schrijven van T-SQL:die volgorde van declaratie impliceert een volgorde van uitvoering . Programmeurs zijn gewend aan de dwingende procedurele stijl van C-achtige talen en begrijpen de declaratieve set-gebaseerde aard van SQL niet. Ik heb eerder over dit probleem geschreven en voorbeelden gegeven wanneer de drogreden fouten veroorzaakt:
- T-SQL-functies impliceren geen bepaalde volgorde van uitvoering
- Op SQL Server boolean-operator kortsluiting
Zodra je je volledige code hebt gepost, kunnen we zien waar je de misvatting in jouw geval precies hebt gemaakt en een bepaalde volgorde van uitvoering hebt aangenomen.
na update
OK, dus ik moet beheren dat in jouw geval de code correct is in de volgorde van uitvoering, het result
kolom kan niet worden geprojecteerd zonder eerst de CASE
te evalueren . Als de CASE in een WHERE-clausule had gestaan, zou het anders zijn geweest.
Uw probleem is anders:ISNUMERIC
. Deze functie heeft een zeer genereus begrip van wat NUMERIC
betekent en heeft al veel ontwikkelaars gebeten. Het accepteert namelijk waarden die CAST en CONVERT zullen weigeren. Zoals degenen met een komma:
declare @n varchar(8000) = '1,000';
select isnumeric(@n);
select cast(@n as float);
select case when isnumeric(@n)=1 then cast(@n as float) else null end;
U hebt dus waarden die voldoen aan de ISNUMERIC
testen maar niet converteren. Gewoon een waarschuwing, hoe meer je in deze aanpak graaft, hoe meer gesloten deuren je zult vinden. Het is gewoon geen veilige manier om de cast te doen die je nodig hebt aan de serverkant. In het ideale geval corrigeert u het gegevensmodel (maak het veld een float als het floats opslaat). Afgezien daarvan, triageer de gegevens en verwijder alle waarden die geen goede float zijn, en repareer de front-end/applicatie om geen nieuwe meer te introduceren, voeg vervolgens een beperking toe die de fout activeert als er nieuwe slechte waarden verschijnen. Je zult dit niet in een zoekopdracht kunnen oplossen, die weg ligt bezaaid met lijken.
Met de volgende versie van SQL Server heb je een nieuwe functie, TRY_CONVERT
, dat zou je probleem oplossen.