Если вы действительно застряли с этим ужасным замыслом, то я бы попытался завершить ваш запрос, чтобы сделать его максимально безопасным, например:
SELECT
EmpId,
LEFT(Contract_Hours, 5) AS TotalContractHours,
SUM(CONVERT(INT, CASE WHEN ISNUMERIC(LEFT(Contract_Hours, 5)) = 1 THEN CONVERT(NUMERIC(19,2), LEFT(Contract_Hours, 5)) ELSE 0 END)) AS SummedHours
FROM
tbl.Employee
GROUP BY
EmpID,
LEFT(Contract_Hours, 5);
Как это работает?
Нам не нужно беспокоиться о SUBSTRING
, так как вы всегда начинаете с крайней левой позиции строки, поэтому LEFT
проще. ISNUMERIC
сообщит нам, получим ли мы число или нет, чтобы мы не получали исключение, пытаясь CONVERT
что-то из строки в число. Таким образом, если самые левые 5 символов являются числовыми, мы CONVERT
переводим их в десятичные дроби 2dp, затем в INT
, затем SUM
их.