Olly Barkley kicked 16 points in his final game for Bath to condemn Sale to a fifth straight defeat.
Barkley's accuracy from the tee, with four from four, was the sole noteworthy element of a dire first half that saw Nick Macleod kick one penalty for Sale.
Fly-half Barkley, who is joining Racing Metro, converted David Wilson and Stuart Hooper tries after the break.
Johnny Leota went over for Sale but it was not enough to ease their worries as Bath were awarded a late penalty try.
Barkley was given the honour of leading Bath onto the field and, after Macleod missed an early shot at goal, slotted two penalties in quick succession.
Sale were full of endeavour but lacked a genuine attacking threat, although they did claw back three points only to see Barkley continue his impressive form from the tee to make it 12-3 at the turnaround.
The visitors' case was hindered further when winger Tom Brady was sin-binned for a dangerous tackle on Ben Skirving and their fly-half, Macleod, then missed a second attempt at goal in the run up to half time.
Wilson rounded off a move he created, with a surge into Sale's 22, to touch down from close range for the opening try after 51 minutes.
Barkley's conversion was followed by Leota's score eight minutes later, which Macleod improved with the extras.
Danny Cipriani, who had been demoted to the bench, emerged for the final quarter of an hour and his kicking out of hand provided the Sharks with ammunition.
His cunning chip almost produced a try but with Bath under pressure it was Sale's inaccuracy in attack that cost them.
Bath broke out and rumbled Hooper over, Barkley converting, and Sale shot themselves in the foot when Andy Powell was sin-binned for a high tackle.
The visitors' weakened pack was under pressure late on and when a scrum went down on their line, the home side were awarded a penalty score.
VIEWS FROM THE DRESSING ROOM
Departing Bath fly-half Olly Barkley:
"The last thing I wanted today was an unhappy changing room after losing three games on the bounce. That was my main priority.
"Walking across the pitch after the game, the realisation that I won't be doing it again in a Bath jersey is quite sad. But I've had a fantastic time here, and it is time to move on to a new challenge.
"I will leave this place with a heavy heart, but also with a happy one."
Bath head coach Gary Gold:
"I am very satisfied with the performance from a defensive perspective, but we need to learn to kill off teams. We let them back into the game at 19-10.
"We can still work really hard on our attack. We have an exciting back-three, and we need to get them into the game more often.
"Immediately, the message after the game today was that on Monday we focus on Kingsholm and Gloucester next weekend. It is not going to get any easier.
"At 19-3 up, we need to go for the jugular and put teams to bed."
Sale director of rugby Bryan Redpath:
"At 19-10 down we had a couple of opportunities that we didn't take, but the scoreline was not a true reflection today.
"It was more encouraging, but we were on the wrong end of some tough decisions.
"We have just got to keep beating away at the drum and work hard to get a better performance. The players' attitude today was great."
Bath: Abendanon; Eastmond, Hipkiss, Donald, Biggs; Barkley, Claassens; James, Mears, Wilson; Hooper, Attwood; Fearns, Skirving, Taylor.
Replacements: Cuthbert for Hipkiss (77), Vesty for Donald (63), McMillan for Claassens (77), Catt for James (67), Batty for Mears (63), Perenise for Wilson (67), Skuse for Hooper (78), Day for Attwood (59).
Sale: Miller; Brady, Leota, Tuitupou, Cueto; MacLeod, Willis; Roberts, Taylor, Buckley; McKenzie, Myall; Doyle, Seymour, Powell.
Replacements: Addison for Tuitupou (59), Cipriani for MacLeod (63), Fowles for Willis (59), Croall for Roberts (72), Ward for Taylor (59), Cobilas for Buckley (62), Gaskell for McKenzie (59), Easter for Doyle (47).
Ref: Sean Davey (RFU).