宋开宝元年(968年)平定后蜀之后,北汉国主刚死,人心未定,赵匡胤突然转兵大举进攻北汉。八月,宋太祖命昭义节度使李继勋,侍卫步军都指挥使党进、宣微南院使曹彬、棣州防御使何继筠、怀州防御使康延昭、建武节度使赵赞等各率所部,分别自潞(今山西长治市)、晋(今山西临汾市)二州进攻太原。
九月,北汉内部发生动乱,供奉官侯霸荣杀死北汉新主薛继恩,司空郭无为又杀死候霸荣,迎立太原尹刘继元为国主。刘继元见宋军已入其境,急忙向辽请援,同时命侍卫都虞侯刘继业、冯进珂等领兵扼守团柏谷(今山西祁县东南),以拒宋军。宋军迅速将该部北汉军击破,直逼太原城下。
十月,宋太祖遣使至太原劝降,刘继元拒绝降宋。十一月,辽军兵马总管塔尔率大军救援北汉,逼进太原。李继勋等因久攻太原不下,辽军又至,遂引兵南归。北汉军乘机发动追击,进掠宋晋、绛(今山西绛县)两州。
宋开宝二年(969年)二月,宋太祖命曹彬、党进各领兵先赴太原,亲自率大军继后,亲征北汉。北汉刘继业、冯进珂二将得知宋太祖已至潞州,并派李继勋率前军赶往团柏谷,自知寡不敌众,仓皇奔还太原。
三月,宋太祖至太原,征发当地民工数万人,修筑长墙包围太原,并筑长堤,引汾水灌城,多方进攻,长达三个多月,无法破城,当时天气酷热,宋军很多人患上破腹病,听到辽军出兵救援北汉的消息。宋军仓皇退兵。辽与北汉联军追击宋军,宋军大败而逃,弃下大量军事物资,为北汉所得。
宋开宝八年(975年)十月,南唐已平,宋太祖再兴北伐之师,并准备收复燕云。次年八月,派侍卫马军都指挥使党进、宣徽北院使潘美等分率五路军马云集太原城下,与北汉军和来援的辽军展开激战。不料,这时宋太祖赵匡胤死去,宋太宗赵光义继位,因国丧之故,遂于十二月召回北伐之师,至此,宋太祖遣军进攻北汉的战争,均因辽军援阻,未获成功。
宋太宗于太平兴国三年(978年)迫使陈洪进“纳土”、吴越“归地”以后,决心消灭北汉。鉴于以往进攻北汉均因辽军援救而失败的教训,宋太宗制定了肃清外围,先阻辽援,后取太原的方略。继而,加紧整训军队,命邻近北汉的晋、潞(今山西临汾、长治)、邢、镇、冀(今河北邢台、正定、冀县)等州,修造兵器及攻城器具,转运粮草,积极作攻战准备。
太平兴国四年(979年)正月,宋太宗决定再次进军北汉,并采取攻城阻援的作战指导,其部署是:命宣徽南院使潘美为北路都招讨制置使,率崔彦进、李汉琼、曹翰、刘遇等军攻太原;命云州观察使郭进为太原北石岭关(今山西忻县南)都部署,阻击从北面增援的辽军;命田仁朗、刘绪负责侦察太原城四面壕寨并检查攻城的各种器材;命孟玄莆为兵马都钤辖,驻泊镇州,阻击从东面增援的辽军;
命河北转运使侯陡、陕西北路转运使雷德骧分掌太原东、西路转运事,并命行在转运使刘保勋兼任北面转运使;宋太宗赵光义亲率主力一部出镇州(今河北正定),牵制幽州的辽军大规模西援或南下。
太平兴国四年二月十五日,宋太宗率军由东京(今河南开封)出发,三月进至镇州,分兵攻盂县(今山西盂县东北)、沁州(今山西沁源)、汾州(今山西汾阳)、岚州(今山西岚县)等外围州县,以牵制这些地区北汉军对太原的增援。这时,郭进军已进至石岭关。
北汉主刘继元闻宋大兵压境,急遣使赴辽求援。辽帝命南府宰相耶律沙为都统,冀王敌烈为监军。率兵援救北汉。三月十六日,耶律沙率军日夜兼程进至白马岭(今山西盂县东北),与郭进阻援部队相遇,两军隔大涧对峙。
耶律沙打算等后续部队到齐后再战,敌烈等认为立即进攻有利,于是抢先渡涧进攻宋军。郭进军乘其半渡,突然出击,斩敌烈等五员大将,歼万余人,辽军余众仓皇逃走。北院大王耶律斜轸率军赶到,万箭齐发,宋军始退。北汉再次派人向辽求援,但使者被郭进军捉住,并在太原城下杀掉。北汉潜师出击,又被宋军击败,遂据城固守。
宋军大援获胜,乘势全线进攻。四月中旬,宋军攻下盂县、隆州、岚州等地区后,宋太宗率军至太原,以数十万大军,集兵围城。四月二十三日,巡城抚慰诸将,并致书招降北汉主刘继元,被拒。二十四日夜,宋太宗至城西督诸将攻城,未果。
五月初一,又督渚将急攻城西南隅,陷其护围羊马城。北汉宣徽使范超出降。初三,宋太宗至城西北隅,北汉马步军都指挥使郭万超等先后出降。初四,宋太宗至城南,再次招降,同时挥军猛烈攻城。远在代州(今山西代县)的北汉驸马都尉贞俊向辽帝告急,耶律贤因辽军在白马岭新败,不能再发救兵。
这时,宋太宗下令再次决汾水灌城,使太原城内一片汪洋。刘继元在外无援兵,内无斗志的情况下,于五月初六出城投降。宋太宗命刘保勋主持太原政务,封刘继元为右上将军、彭城郡公。