在公元1000年(宋真宋鹹平三年)正月,遼軍在瀛洲裴村圍殲了高陽關守將康保裔部並俘虜了康保裔,雖然範廷詔在莫州設伏重創了遼軍,稍微給宋軍挽回了點面子,但總得來說,遼軍的損失小於宋軍。遼軍失利後就北還,繼續積蓄力量準備南侵。
公元1001年(宋真宋鹹平三年)七月,宋朝探知遼軍又有南向動向。遂以王顯為鎮、定、高陽關都部署,率馬步軍10萬向威虜軍調動,擺出大陣等候遼軍的到來。但這次宋軍的情報不準確,數萬大軍在威虜軍等了1個半月也不見遼軍的到來,等到宋軍間諜發來第2份情報,才知道遼軍主力尚在炭山——炭山是遼國傳統的夏捺缽,一時半會不會南下,籤於威虜軍是邊防州,糧草供應壓力比較大,宋真宗命令主力撤回鎮、定,但前軍騎兵並沒有撤回,依然部署在威虜軍。
十月八日,陝西戰場傳來不利訊息,朝廷抽掉威虜軍附近的五個前鋒鈐轄之一的張凝調往西線任邠、寧、環、慶諸州副都部署,張凝留下的位置由馬步軍都軍頭、領涿州刺史田敏接任。
十月九日,遼軍南侵開始,遼國樑王耶律隆慶率前鋒精銳騎兵3萬經過涿州,直撲威虜軍。宋軍得知訊息,前軍所部向威虜軍收縮,當時宋軍最好的幾個騎兵指揮官李繼宣、魏能、楊嗣、楊延昭、田敏、秦翰都齊集威虜軍。幾個指揮官合議決定以魏能、田敏、秦翰、李繼宣3萬主力背城立陣,楊嗣、楊延昭所部6000騎兵先進駐威虜軍西北的羊山,準備包抄遼軍後路。張斌所部3000騎兵在羊山邊的長城口先伏擊遼軍,將遼軍吸引到威虜軍的戰場上來,為二楊計劃中的包抄鋪平道路。
由於連續的秋雨,使遼軍吃足了苦頭,由於遼軍的弓弦是皮質的,被雨水浸泡後便溼緩不堪用了,遼軍的騎射威力大大減弱了。十月十六日,上午,耶律隆慶率軍過長城口時,預先埋伏的張斌部向猝不及防的遼軍發起攻擊,毫無防備的遼軍又無法使用弓箭,於是被宋軍順利突破。張斌率軍直接衝擊遼軍中軍,由於遭到突然襲擊,遼中軍頓時陷入大亂,但畢竟遼軍也是精銳,短暫的混亂過後很快就恢復了秩序,遏制住了張斌的攻勢。張斌部畢竟兵少,一擊得手,立馬就開始突圍,一路退向威虜軍。
此時的威虜軍城下有3萬宋軍主力,以魏能所部前陣騎兵為主,於城西列成大陣,秦翰和田敏所部分為左右兩翼掩護魏能側面。另以戰鬥力強悍的李繼宣部為預備隊,等待遼軍的到來。中午時分,遼軍推進到威虜軍,與宋軍對陣。面對宋軍背城立陣,側後無憂,而遼軍擅長的迂迴包抄戰術又無法使用,於是,耶律隆慶決定派鐵林軍重陣,鐵林軍是遼軍中的重灌騎兵,由鐵林相關統率。宋軍中軍主將魏能也率領精銳部隊對遼軍的攻擊箭頭展開反衝擊,在左右兩翼的配合夾擊下不但粉碎了遼軍的正面衝擊,保證了大陣正面的安全,並在反衝擊過程中一舉射殺遼統軍鐵林相公,並順手帶走了他的十五位下屬。由於主將被殺,遼軍軍心浮動,在宋軍的持續攻擊下,遼軍向西北的羊山敗退。宋軍兩翼秦翰和田敏的6000騎兵轉入追擊,尚未出動的預備隊李繼宣部也同時移向威虜軍城西北八里的赤虜屯住,並派出聯絡官跟隨秦翰部前進,隨時準備策應追擊部隊。
先前埋伏在羊山的楊嗣、楊延昭部本來是用來包抄遼軍後路,由於遼軍敗退太快,不得不正面堵截遼軍。二楊所部迎頭殺出,對遼軍展開正面攔截,前有堵截,後有追兵,遼軍爆發出了驚人的戰力,二楊部頑強抵擋,但奈何遼軍人多,二楊的正面狙擊宣告失敗,但也遲滯了遼軍的速度,為追擊部隊的到來贏得了時間。正當遼軍最終攻下羊山上的宋軍陣地時,一路尾追遼軍的秦翰部和田敏部追上了遼軍後衛部隊。李繼宣得到情報後立即帶領自己的部下直撲羊山,在秦翰部咬住遼軍後一會兒,李繼宣部也追上了遼軍。
隨著秦翰部、李繼宣部的加入,遼軍終於抵擋不住,向羊山上退去,李繼宣死死咬住遼軍,把遼軍從羊山南麓轉過山脊,追殺到北麓。戰鬥中,身先士卒的李繼宣多次因為戰馬中箭而更換戰馬。最終在牟山谷,李繼宣部追上遼敗軍主力並殺入,取得了巨大的戰果後,剩餘的遼軍逃向了八里外的遼國邊界。直至日暮時分,李繼宣豐碩的戰果回到前進基地赤虜。
十月十六日一天的戰鬥,宋遼雙方首戰長城口,次戰威虜軍,三戰羊山,最終以宋軍擊退遼軍、斬級二萬、陣斬遼統軍鐵林相公以下將領十五員的輝煌勝利告終,如此豐碩的戰果,在宋軍對遼長達四十年的戰爭歷史上也是少見的。
戰後,宋廷果斷放棄前沿防禦戰略,命令鎮、定主力不再出擊威虜軍,在唐河組織防禦,同時命令前陣騎兵後撤,在莫州都部署桑贊下屬的一萬步兵的掩護下後撤至寧邊軍,進行戰後休整。另外,宋軍高層在採納了知雄州何承矩的建議,使用圍魏救趙的戰術,在整個河北防線的最東段的乾寧軍派出部隊,搭乘水軍的淺海巡邏船(刀魚船),自界河入海,跨渤海在遼境的平州(今河北盧龍)登陸,發起進攻,以吸引遼軍主力回救。在東線的淤口關、益津關,宋軍均出兵對遼境展開了牽制性進攻。
在遼軍前鋒失敗,遼聖宗不甘心此次南征失敗,於是親率遼軍主力南下,避開威虜軍,取道易州直撲滿城。十月二十八日,遼聖宗到達滿城,更大規模的戰爭一觸即發。
這時,老天幫了大宋的忙,連綿的秋雨,泥濘的道路成了遼軍的噩夢,加上軍心受挫,面對著已經成型的宋軍防線,遼聖宗不得不下令撤軍,遼軍南侵告一段落。
遂城大捷是在沒有主將統一指揮,是下面將領主觀能動性的體現,根據戰場的情況作出了合理的配合,實際上也是一次違令作戰,跟滿城之戰一樣,沒有條條框框的制約,宋軍戰力並不差。特別是這次是由騎兵單獨會戰取得,說明宋軍的騎兵非常善戰,即使對上遼軍的精銳鐵甲騎兵也不落下風。當然,客觀上講,遂城之戰的勝利並沒有改變軍事上遼國對北宋保持壓力的現狀。