Parse numbers from text based on relative position to certain substrings
As long as there are just a small number of patterns (and they hardly change) you can use a CASE to find the start position of the digits you want to extract and then simply extract the following n characters if they're digits:

CREATE FUNCTION fnExpectedBlend
    (
        @Item VARCHAR(30)
    )
RETURNS NUMERIC(15, 6)
AS
    BEGIN
        DECLARE @Pos INT

        SET @Pos =
        CASE-- PATINDEX plus length of search string
           WHEN PATINDEX('%BIO[0-9]%', @Item) &gt; 0 THEN PATINDEX('%BIO[0-9]%', @Item) +3 -- PATINDEX plus length of search string
           WHEN PATINDEX('E[0-9]'    , @Item) &gt; 0 THEN PATINDEX('E[0-9]'    , @Item) +1
           WHEN PATINDEX('NL[0-9]%'  , @Item) &gt; 0 THEN PATINDEX('NL[0-9]%'  , @Item) +2
           WHEN PATINDEX('MG[0-9]%'  , @Item) &gt; 0 THEN PATINDEX('MG[0-9]%'  , @Item) +2
           -- easy to extend with additional codes
        END;

    -- assuming there's up to 2 digits, otherwise add another WHEN
    RETURN ISNULL(CAST(CASE WHEN SUBSTRING(@Item, @Pos, 2) LIKE '[0-9][0-9]' 
                            THEN SUBSTRING(@Item, @Pos, 2)
                            ELSE SUBSTRING(@Item, @Pos, 1) -- first character is always a digit
                       END AS NUMERIC(15,6)) / 100, 0)
END