Situation #1
Use a Derived Table (Or a Common Table Expression [CTE] in SqlServer 2005) and lose the variables:
SELECT
t1.col1, t1.col2, dt.col1, dt.col2
FROM
Customer t1
CROSS JOIN
(
SELECT TOP 1 col1, col2
FROM GeneralInfo t2
\) dt
WHERE t1.status > 0
Situation #2
Discussion is incomplete without mentioning effect of concurrency & transaction isolation. Yes, splitting into smaller queries may reduce lock hold time and reduce contention, but what does that gain if the end result is *different* than 1 large statement, because other processes changed data between the steps of a broken out process ?