• -- The WHERE clause must be evaluated for each row in the Stock table

    -- in order to determine which rows qualify for the UPDATE.

    -- The likelyhood of a table lock might be high.

    -- So, determine which rows qualify without locking the stock table for update.

    -- Capture the PK of the stock table, and the new value.

    SELECT s.PrimaryKey, x.NewequivQty

    INTO #Stock

    FROM Stock s

    LEFT OUTER JOIN Pack p

    ON s.Product = p.ProductId

    AND s.Pack = p.PackId

    CROSS APPLY (

    SELECT

    OldEquivQuantity = ISNULL(s.equivQty,0),

    NewequivQty = s.Qty * ISNULL(p.Factor,4.5) / 4.5

    ) x

    WHERE x.OldEquivQuantity <> x.NewequivQty

    -- Then apply the update, touching only the rows which will be updated

    -- The downside? You end up reading the stock table twice.

    UPDATE s SET equivQty = NewequivQty

    FROM Stock s

    INNER JOIN #Stock st

    ON st.PrimaryKey = s.PrimaryKey

    “Write the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.” - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden