Cursors are slooowwwwwww. you can add the ON DELETE CASCADE option to the foreign key in the sale_detail and sale_address tables. This makes it so that whenever you delete an entry in the parent table, all dependent records are deleted in the child tables that are created with this option. alternatively:
CREATE PROCEDURE Sale_DeleteSaleTimedOut
AS
BEGIN
BEGIN TRANSACTION DeleteSaleTimedOut
DELETE FROM sale_detail
FROM sale_detail AS d
INNER JOIN sale AS s
ON d.sale_id = s.sale_id
WHERE s.date_modified < (getdate() +0.02)
DELETE FROM sale_address
FROM sale_address AS a
INNER JOIN sail AS s
ON a.sale_id = s.sale_ID
WHERE s.date_modified < (getdate() +0.02)
DELETE FROM sale AS s
WHERE s.date_modified < (getdate() +0.02)
COMMIT TRANSACTION DeleteSaleTimedOut
END
almost anything you can do with cursors you can do with joins or subqueries or temporary tables and all of the above will be faster.