正当曹操在邺城和袁尚及审配展开殊死战的时候,原困守在平原郡的袁谭,乘机向青州征调部队,并攻略了冀州东方的甘陵、安平、渤海、河间四郡。
袁尚逃亡中山郡时,袁谭也领军追踪而至,袁尚不敢和他对抗,乃弃其部队,带着少数随从逃往故安。袁谭尽收编其兵马,正好袁熙也从幽州赶到,袁谭便和袁熙重整袁绍旧部,打算重振袁氏雄风。
曹操深知袁谭的野心,便遣使送书信给袁谭,责其不但未以四州归顺朝廷,反而欲拥兵自重,再度行割据之实,显然违背当年请求援助时之约定。袁谭无言以对,曹操便乘机断绝其儿女亲家关系,派人送还其女儿;然后编组大军,准备攻打冀州东北区袁谭的势力范围。
曹操这次将大部分军,分别部署在新占领的冀州中部及西区。自己仅带领张郃和徐晃两员猛将的军队,并由荀攸、郭嘉、董昭组成参谋本部,直属亲卫骑兵队虎豹骑,则由曹纯率领指挥,这也是曹操继曹真、曹休后第三位提拔的新生代曹族将官,显示曹操已有计划培养自己的曹家班底了。
此外,曹操下令青州的游击军团总指挥臧霸和孙观,由青州北上,进攻袁谭在青州的势力区。这个安排,也显示曹操仍有意将这块复杂又过分遥远的东战线,在事后由富独立统治能力又忠诚可靠的外围友军臧霸等来经营管理。
袁谭听说曹军指向平原郡,立刻往北撤退两百多里,据守在渤海郡的南皮城,准备和远来的曹军决一死战。
建安九年(204)十二月,曹军攻入平原郡,周围县城都投降。但正值严寒,河川全部冰冻,行军非常困难,袁谭判断曹军必会在平原郡过冬,等春天后再行进攻南皮。不过,曹操在和参谋人员详细信评时机和作战的艰辛程度后,仍决定在寒冬里完成这次北征。
翌年,河北平原各河流全部冰冻,通往南皮的清河处于冰天雪地中。曹操只好下令徐晃、张郃征集附近居民锥开河上冰冻,以便船只运航,但民众实在受不了痛苦,相继逃亡,最后只有下令军士自己动手,历尽千辛万苦,才打通北上航道。为了鼓舞士气,曹操亲率张邰、徐晃、曹纯等武将,天天冒风雪督工,以加速工作进度。
在南皮的袁谭根本不相信曹军会在寒冬到来,因此当哨探报告曹军冒风雪北上的消息,袁谭大为吃惊。郭图和辛评主张乘曹军远行而来,尚未稳定前,急攻之或可给予致命的打击。袁谭从其言,乃亲率突击队出城攻击曹军。
生长在华中地区的曹军很少在冰冻天气中作战,手脚皆不灵活,一时间死伤惨重。徐晃、张郃、曹纯三将拼命死战,袁谭以人数少,又怕城中有失,不敢过分拼战,在天黑前便收兵回城。
由于军士无法适应,曹操有意撤兵。
但曹纯却认为: “今天历经千辛万苦,不远千里而来,怎能轻言撤军,如果无法赢得胜利而退兵,必会折损兵马,在这长远的撤军途中,必危及军团的安全。”
年轻的曹纯这番话的确有见识。
参谋本部也同意曹纯的看法,他们更建议加强军队运动,让由内部引发的热量来御寒,使手脚恢复灵活。曹操因而下令加紧攻城。
第二天一大早,攻击行动便开始,但为避免城内兵马在曹军热身运动完成前便出城反击,这次攻击行动一开始,好像在作集体跑步,曹军各队分开,绕一大圈,再部署进入攻击预备线。城上的袁谭看得莫名其妙,但又害怕曹军有埋伏,也不敢随便出城反击。
临近中午时刻,气温稍升高,曹军热身运动也已完成。曹操亲自击鼓,一时士气大振,各部队奋勇向前。袁谭本再想出城抗拒,但曹军各组队由四面八方猛攻,袁军根本不知往哪边对抗较好。徐晃军下的乐进部队,抢先攻进东门,郭图无法抵挡,当场被擒。袁谭由北门杀出,正逢曹纯的虎豹轻骑车,一阵冲杀,袁谭意外地被曹纯斩杀,袁军群龙无首,全面溃散,南皮也因而陷落。
其实,南皮之役曹操赢得相当侥幸,曹操虽已夺取平原郡数个县城,但冀州江区及南皮到平原间的宽广地带,仍大多亲附袁谭。幸好天寒地冻,大多不愿出兵,否则若随时在各据点突击曹军或其补给线,南皮的曹军主力军随时有被孤立的危机。曹操的参谋人员当时坚持冒雪北上,可能的原因也在于此。攻其不备,利用冰天雪地大家都不想动的时刻克服万难作远途行军,曹操用兵之大胆和智慧的确令人敬佩。