Вот одна попытка.Он делает много предположений, например, что до ПОСЛЕ размера 2 не будет пробела и что обе стороны * (или X из вашего описания - что это?) Будут преобразованы в INT.
DECLARE @foo TABLE
(
[Ship Qty] INT,
Size VARCHAR(32),
Qty INT
);
INSERT @foo([Ship Qty], Size)
SELECT 2, '1*100 EA'
UNION SELECT 3, '3*20 ML';
UPDATE @foo SET
Qty = [Ship Qty] * CONVERT(INT, LEFT(Size, CHARINDEX('*', Size)-1)) *
CONVERT(INT, SUBSTRING(Size, CHARINDEX('*', Size)+1,
CHARINDEX(' ', Size)-CHARINDEX('*', Size)))
WHERE
CHARINDEX('*', Size) > 0
AND CHARINDEX(' ', Size) > 0
AND Qty IS NULL;
SELECT [Ship Qty], Size, Qty FROM @foo;
Я настоятельно рекомендую хранить эти данные лучше.Вместо хранения "1 * 100 EA" сохраните 1 в столбце, 100 в столбце и EA в столбце.Поддерживать это будет кошмар, не говоря уже о том, чтобы столбец размера получал согласованные данные (и что ваша формула будет работать против всех будущих реализаций).
Я также предлагаю не иметь имен столбцов со специальными символами(например, пробелы).Никому не нравится вводить квадратные скобки, когда их можно избежать.
Наконец, если вы можете принудительно вводить данные при вводе, вы должны рассмотреть вычисляемый столбец или представление.Вам не нужно постоянно возвращаться и обновлять таблицу после факта.