Ваша линия
SELECT @NId = cast(substring(id, 3, len(id)) as int)
FROM tblProduct
group by left(id, 2)
order by id
не делает то, что вы хотели. Это терпит неудачу, потому что вы не можете включить id в выборку напрямую, потому что вы группируете по левому (id, 2), а не по самому id. Нельзя помещать что-либо в оператор выбора при группировании, если оно не является частью Group By или агрегатом (таким как SUM и MAX.)
(Edit: Corrected, Left и Substring не основаны на 0 - чтобы получить тег PRD и тому подобное, нам нужна подстрока 4, а left 3.)
Правильный способ сделать это будет:
SELECT @NId = cast(substring(MAX(id), 4, len(MAX(id))) as int)
FROM tblProduct
group by left(id, 3)
order by left(id, 3)