高祖便命太宗皇帝领兵出征,十一月,太宗皇帝趁黄河结冰的机会顺利渡河,然后用“坚壁挫锐”的战术来和刘武周的大将宋金刚对峙。
太宗皇帝坚守不出,挫敌锐气,待机而动,因为他知道敌军深入,必定会粮草不济。次年的二月,在宋金刚军粮草缺乏时破敌于介休城,刘武周也放弃太原北逃。至此,关中的东北部也宣告稳定。
618年,隋炀帝被杀的消息传到洛阳后,守将王世充拥立越王杨侗称帝,改元皇泰。619年四月,王世充夺取了政权,改国号为郑,割据关东地区。第二年七月,太宗皇帝进军洛阳,开始平定王世充。
从这年的八月完成对洛阳的包围,到下一年的二月,虽然经常昼夜攻城,但终因洛阳城坚固而无法取胜。将士思归心情迫切,太宗皇帝却坚定意志,鼓励将士说:“这次我们领重兵而来,应当一劳永逸,东边各州已经望风而降,只剩下了洛阳一座孤城,从现在形势来看很难再坚守多长时间了,大功马上就要告成,你们为什么又要放弃无功而返呢?”
在太宗皇帝的坚持下,众将表示随他决战到底。
此次决战,太宗皇帝总是身先士卒,有一次,他带五百骑兵巡视前方地形,结果被敌人骑兵包围。敌将单雄信挺槊直取太宗皇帝,尉迟敬德跃马而出,将单雄信刺落马下,掩护太宗皇帝突出了重围。
此后,便是有名的虎牢之战。在王世充被围将败的紧要关头,河北的窦建德领兵十万,号称三十万,为救王世充而大举南下。当时窦建德自称夏王,占据河北和山东。他开始也不愿意相救,坐观龙虎相斗。后来看到王世充处于下风即将被歼,便听从了部下刘彬的建议,出兵相救,以免在王世充灭亡之后,自己也一样力单势孤,难逃厄运。
窦建德开始时写信给太宗皇帝,要他退到潼关,讲和修好。太宗皇帝断然拒绝,开始部署如何对付窦建德。
太宗皇帝的部下分为两派意见,以薛收为主的一派认为,王世充现在只缺粮草,万一得到接济,战争的胜败就很难预料了。应该在围困洛阳的同时,由太宗皇帝亲自领精锐骑兵抢占虎牢关。在击败窦建德之后,王世充也就不攻自破了。
但是,屈突通等将领却反对,他们认为去虎牢关会腹背受敌,应该先退守新安,再寻机而战。
太宗皇帝最后决定道:“王世充粮草已将用尽,内外离心,我们就应当坐收余利,不必劳师动众去攻击。而窦建德则将士骄横兵卒懒惰,我们必须进占虎牢,扼守险要之地。窦建德如果要和我交锋决战,一定能一战取胜,如果他们畏缩不战,那么王世充十日之内必然溃败。假若现在不速战速决,让窦建德占据虎牢,那刚归降的各城就又无法守卫,我军就很难再有现在的良机取胜了。”
太宗皇帝最终还是采纳了薛收的意见,他命令屈突通和齐王李元吉继续围困洛阳,自己则率领精锐骑兵三千五百火速奔袭虎牢,历史上有名的虎牢之战正式开始了。
太宗皇帝领兵到达了虎牢关,亲自东进二十里侦察敌情,窦建德无法进军,只好就地筑垒固守。此后,窦建德军队几次作战失利,将士思归心理日益加重,军心开始涣散,而运粮道又遭到了突袭,大将张青也被俘。这时,部下建议,渡河攻打怀州,再向西穿越太行山,趁虚攻占上党,然后再南下,占据河东的广大地区,不但能占疆土补充兵力,还能威胁关中,从而迫使唐军退兵自救,洛阳之围不攻自破。但窦建德一心想找唐军决战,根本听不进去,反而说这是书生之见。
五月,太宗皇帝渡河,在黄河北岸牧马,并留下战马千匹,给窦建德一种粮草已尽的假象,他本人则在晚上返回虎牢。
窦建德果然中计,觉得有机可乘,他全军出动,排兵二十里击鼓而进,想用气势吓倒唐军。
太宗皇帝登高观望,然后对部将说:“窦建德过险关鼓噪而进,这是毫无纪律,临城而列阵,是在轻视我军。我们如果按兵不动,他们的勇气必然渐渐衰退,列阵久了将士就会饥饿疲劳,不攻自退,等那时我们再乘势追击,将战无不胜。”
果然不出所料,到了中午,窦建德的军队因为没有开战,士卒又饥又渴,开始争着喝水,很多人坐在地上,没有了开始时的阵形,一副败相。