in parole povere, che valori assumerà numriga?
1 per i record estratti dalla prima select e 2 per quelli estratti dalla seconda;
ordinando per numriga vedi prima quelli uguali a uno dei parametri e poi gli altri, ma per come è scritta la query mi sa che l'order lo applica alla seconda select e non all'unione; prova a mettere le parentesi
codice:
Sql="( SELECT 1 as numriga,* FROM Articoli WHERE codice=pos1 or codice=pos2 or codice=pos3
UNION
SELECT 2 as numriga, * FROM Articoli WHERE codice<>pos1 AND codice<>pos2 and codice<>pos3) order by numriga"