ho una visione del genere:DOVE su Visualizza Alias causa l'errore
SELECT location, CAST(SUBSTRING(location, 9, 4) AS int) AS ProcessCode
FROM dbo.asset
WHERE (status NOT IN ('INACTIVE', 'NOT READY', 'LIMITEDUSE'))
AND (location LIKE '[1-6]-[12]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-_')
Se io lo chiamo così, funziona:
SELECT * FROM FooView
Tuttavia, se posso aggiungere una clausola WHERE:
SELECT * FROM FooView WHERE ProcessCode > 0
ottengo questo errore:
Conversion failed when converting the varchar value '-01-' to data type int.
Perché? Poiché la posizione deve essere nel formato 1-2-100-0800-A
, non vedo come possa esserci un errore di conversione. È possibile che CAST
non riesca prima che lo WHERE
abbia la possibilità di filtrare i risultati? Se è così, allora perché funziona la prima query?
EDIT - work-around
Ho appena avuto un collega suggerire un buon work-around. Funziona, ma non spiega ancora perché il problema iniziale.
questo è nel SELEZIONA per ProcessCode:
CASE WHEN location LIKE '[1-6]-[12]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-_'
THEN CAST(SUBSTRING(location, 9, 4) AS int) ELSE 0 END AS ProcessCode,
per interesse quale versione di SQL Server? e quale tipo di colonna è Location? –
SQL Server 2012. La posizione è varchar (24). –