Sagan got the better of Maximiliano Richeze (Etixx-Quick Step) and Michael Matthews (Orica-GreenEdge) in a bunch sprint to record his record-breaking 12th stage win in the race.
The Slovak has an exceptional track record at the Tour de Suisse, this being the sixth successive edition that he has landed a stage win.
It had seemed that Cancellara had done enough to defend his overall lead when, at an intermediate sprint 12km from the finish, he got the better of Roelandts to claim the maximum three seconds on offer, with the Belgian claiming two.
But a small split in the bunch at the finish meant that Roelandts came in three seconds ahead of Cancellara, which was enough for the two to swap places from second to first in the GC.
Orica-GreenEdge rode at the front for most of the run-in to the finish in an attempt to set up Matthews, setting a searing pace that strung the peloton out in single file.
That meant that when Fernando Gaviria (Etixx-QuickStep), riding seventh in line, lost the wheel of his lead-out man Richeze in the final kilometre, a gap opened up with six riders - including Roelandts - going clear from the rest of the peloton to contest the sprint.
It was a miserable day weather-wise, with rain falling throughout the day and causing a number of crashes.
One victim of the conditions was Robert Gesink (LottoNL-Jumbo), who, having gone into the race as a potential candidate for the GC, was forced to abandon following a crash.
Another was Andrew Talansky (Cannondale), although he was able to continue racing, and eventually managed to catch back up to the peloton within the final 10km.
The day’s break consisted of Sebastien Minard (Ag2r La Mondiale), Matthias Krizek (Roth), Antwan Tolhoek (Roompot Orange) and Marcel Wyss (IAM Cycling), but were caught with over 30km still to race.
Krizek and Tolhoek battled for the mountains points all day, with the former out-sprinting the latter on the final summit to the lead in that classification.
Tour de Suisse 2016, stage two, Baar - Baar, 188km
1. Peter Sagan (Svk) Tinkoff, 4-35-19
2. Maximiliano Richeze (Arg) Etixx - Quick-Step
3. Michael Matthews (Aus) Orica-GreenEdge
4. Magnus Cort Nielsen (Den) Orica-GreenEdge
5. Jurgen Roelandts (Bel) Lotto Soudal
6. Jasper Stuyven (Bel) Trek-Segafredo, all st
7. Danny Van Poppel (Ned) Team Sky, at 3s
8. Reinardt Janse Van Rensburg (RSA) Dimension Data
9. Sven Erik Bystrøm (Nor) Team Katusha
10. Tom Van Asbroeck (Bel) Team LottoNl-Jumbo, all st
Overall standings after stage two
1. Jurgen Roelandts (Bel) Lotto Soudal, 4-42-56
2. Fabian Cancellara (Swi) Trek-Segafredo, at 1s
3. Luke Durbridge (Aus) Orica-GreenEdge, at 6s
4. Peter Sagan (Svk) Tinkoff, at 10s
5. Martin Elmiger (Swi) IAM Cycling, st
6. Ion Izagirre (Esp) Movistar, st
7. Tim Wellens (Bel) Lotto-Soudal, at 11s
8. Johan Le Bon (Fra) FDJ, at 13s
9. Silvan Dilier (Swi) BMC, st
10. Gorka Izagirre (Esp) Movistar, at 14s
Thank you for reading 20 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1