遼軍南下與宋軍布陣
鹹平四年(1001年)七月十日,在宋軍的河北編軍偵察得知遼軍意圖南下的情報後,宋真宗立即任命王顯擔任鎮、定、高陽關三路都部署,調動鎮、定的宋軍主力開往威虜軍,防備遼軍的進攻。但是遼軍並沒有如宋軍所料入侵,而還是在附近駐紮。九月一日,出於節省糧食的考慮,宋軍主力在白等了一個半月後,真宗下令,定、鎮主力撤回本部。
但是作為前鋒的宋軍騎兵部隊卻沒有隨步兵主力撤退,依舊駐守威虜軍。十月九日,遼軍的終於開始行動,遼國先鋒部隊在梁國王耶律隆慶的率領下穿過涿州,殺向威虜軍。面對遼軍突然行動,前線宋軍指揮官迅速調整部署,主力大約30000騎兵由魏能、田敏、秦翰、李繼宣等人帶領背靠威虜軍城牆立陣,準備與遼軍正面交戰,與此同時楊延昭、楊嗣率領6000騎兵行動至威虜軍西北的羊山設伏,準備從後截擊遼軍。
交戰
鹹平四年(1004年)十月十六日,遼軍主力到達長城口。預先埋伏在這裡的張斌所部向沒有準備的遼軍主力發起攻擊,因為雨天遼軍無法使用弓箭,被突然而來的宋軍擊敗。張斌一擊的得手後,順勢直取中軍,目標是擒殺遼軍統帥梁國王耶律隆慶。而遼軍從慌亂中調整過來後,開始組織反擊。張斌所部因為兵力不足,攻勢很快被很快就遼軍遏制。張斌見難以獲勝,只好率部退回威虜軍。遼軍在擊退了張斌所部後向威虜軍進軍。宋遼在威虜軍城西相遇,此時宋軍魏能所部騎兵為主力,於城西結陣,又秦翰和田敏所部分為左右兩翼掩護魏能側面,李繼宣所部為預備隊。
戰鬥開始,遼軍派出精銳鐵林軍騎兵由統軍鐵林相公率領下正面衝擊宋軍大陣,同時宋軍中軍主將魏能也率領所部騎兵對遼軍展開反衝鋒。魏能在左右兩翼的部隊配合下成功抵禦了遼軍的進攻,並在反衝鋒過程中射殺遼統帥鐵林相公,並殺死其手下十五員將領,奪得軍馬物資無數。
在統帥鐵林相公死後,遼軍軍心浮動,無力再戰,被宋軍擊敗,開始向羊山方向撤退,宋軍兩翼秦翰和田敏所部的6000騎兵開始轉入追擊,同時預備隊李繼宣所部也開始向威虜軍城西北八里的赤虜運動,並派出兩騎作為聯絡官隨秦翰部一同出發,隨時策應追擊部隊。當遼軍取道羊山南麓向西北撤退的時候,早就埋伏在這裡的楊延昭所部突然殺出,在遼軍正面進行攔截。在前有追兵,後有堵截的情況下,走投無路的遼軍一下子迸發出強勁的戰鬥力,衝破楊延昭軍的攔截,楊延昭所部傷亡慘重被迫撤離戰場。
雖然楊延昭和楊嗣所部被擊敗,但他們遲滯了遼軍的行動,為宋軍後續追擊部隊的爭取了時間。正當遼軍最終攻下羊山掃清道路之時,一路追擊遼軍的秦翰軍和田敏軍趕到了羊山。李繼宣派住秦翰部的聯絡騎兵也把這一情報發給了屯駐在赤虜並的李繼宣。李繼宣得知後立即率所部開赴羊山。在秦翰部與遼軍接戰後不久,李繼宣部趕到了戰場,遼軍在宋軍連續衝擊下逐漸不支,被李繼宣所部趕上了羊山,然後又從羊山南麓退到山脊,一直被追殺到北麓。戰鬥中,李繼宣多次因戰馬中箭而被迫換馬。最終在牟山谷,李繼宣部追上遼軍主力取得大捷,宋軍斬首二萬、陣前擊殺遼軍統帥鐵林相公以及麾下將領十五員,遼軍精銳鐵林軍幾乎全軍盡喪。