979年(北宋太平兴国四年)五月,宋太宗灭北汉之后,欲乘胜收复燕云十六州之地,于六月顺道从镇州(今河北正定)北上击辽,结果未能如愿,大败而归。
当时的宋辽两国边界线,东段在今河北境内,西段在今山西境内。今山西境内是沿今恒山、雁门山、云中山、芦芽山一线为界,其北部即为辽国统治。辽国常常派兵南下袭扰,今太原及其以北的忻州、代县等地,首当其冲。为阻御辽军,宋太宗又授杨业知代州(治今代县)。杨业在辽军可能出入的要道修建边寨,到年底,建成阳武寨(今原平市西南)、崞寨(今原平市崞阳镇)、西陉寨(今原平市西北)、茹越寨(今繁峙南)、胡谷寨(今代县东北)、大石寨(今应县南)等6寨,加强了防御阵地。
980年(太平兴国五年)三月,辽国皇帝景宗耶律贤,亲率骑兵10万余人进犯雁门。当时杨业所部军队,仅有代州一州的厢军(地方军)和数千禁军(屯驻的中央军)。面对10倍以上的敌人,杨业沉着冷静,充分依托有利地形,给进犯之敌以沉重打击。雁门山峡谷险峻狭窄,两侧为悬崖峭壁,在长达几十里的山谷中,10余万骑兵驰进困难。
据此,杨业命部将董思源等率兵阻断峡谷南口,自己亲率数百精骑,自西陉(雁门关峡谷西侧,傍西陉山)绕出雁门关北口,向在峡谷中行进的辽军后军发起突袭。辽军根本没有料到宋军会在这里出现,顿时惊乱,首尾不能相顾,自相践踏,溃不成军,大败而逃。此役,杨业“出奇制胜”,取得“以少胜众”的巨大胜利,给辽军以沉重打击。之后,杨业又在要地增修楼板寨(今原平市西南)、土墱寨(今原平市北)、石趺寨(今原平市西)等,边防更为巩固。
982年(太平兴国七年)五月,辽又分兵东、西、中3路入侵,其东、西两路分别在今河北、陕西境内,中路仍在雁门。入侵雁门的辽军又被杨业率所部打败,杨业屡败辽军,智勇双全,被誉为“杨无敌”。
986年(北宋雍熙三年)正月,宋太宗采纳大臣意见,乘辽国圣宗帝年仅12岁即位不久,太后萧氏专国政之机,出兵北伐,以图收复燕云十六州之地,宋军分为东、中、西3路,先后出动,向北进击。其中西路命潘美为云(今大同市)、应(今应县)、朔(今朔州市)、代等州都部署,杨业为副,王侁为都监,刘文裕为护军,兵力数万人。于二月出雁门关,宋军连续攻克寰、朔、应、云诸州后,各派兵防守,杨业率部还屯代州(今代县),潘美率部东进,准备与中路宋军会师。
东路由于宋军被辽军大败,死伤数万人。宋太宗急诏潘美和杨业迁云、应、朔、寰4州居民及吐浑部族南下,分置河东(今太原)、京西(今河南郑州)等地。潘美、杨业正组织居民南迁未已。辽军占领寰州,兵锋正盛。杨业据此情况,认为不可与辽军死战硬拼,但潘美、王侁等却主张大张旗鼓与辽兵对抗,攻打寰州,掩护四州居民内迁,反对杨业的意见,并斥责杨业怯懦畏敌,诬其阴怀异志。在被威逼诬责之下,杨业不得不率兵北上攻打寰州。
杨业深知此行必败无疑,仍想尽量减少损失,求侥幸于万一,出战之前特别约定潘美、王侁等在陈家谷口(今宁武阳方口陈家沟)两侧布置步兵强驽,待杨业转战到此地时,以两侧步兵夹击辽军,加以援救接应。杨业孤军从代州出雁门,北攻寰州。在途中与耶律斜轸所领辽兵相遇。辽军四面攻击,杨业奋力杀敌,其八子延玉战死,淄州刺史王贵和岳州刺史贺怀浦亦战死。杨业突出重围,退至狼牙村(今朔州市南),又被辽军追至。杨业苦战终日,于黄昏时仅与百余战士退至陈家谷口。
潘美、王侁等在杨业出发后,按约定陈兵于陈家谷口,等到近午,尚无杨业战况消息。派人登上托逻台远望,无所见,以为辽军已被杨业打败。王侁想争功受赏,即率其本部擅自脱离大队去抢夺破辽之功。潘美身为主帅,不加约束,随后也带主力撤走。王侁等率军沿交河西南行20余里,得知杨业兵败,惊恐之下,挥军逃走。杨业到陈家谷口,见无兵接应,拊胸大恸!乃与余众竭力奋战,身被数十创,士卒死伤殆尽,遂为辽军所俘。杨业受重伤被俘后,不屈绝食,三日而死。宋廷闻知杨业被俘殉国的消息,举朝震动。宋太宗封其子杨延朗等五人官。主帅潘美降三级留用,王侁、刘文裕充军。
宋军北伐以先胜后败而结束。此后,北宋王朝对辽战争完全陷于被动,再也无力收复燕云地区。