赵光义率军从镇州出发,六月十九日到金台屯,二十三日到幽州城南,驻扎在宝光寺。
此时,辽军方面,幽州城内有韩德让和耶律学古,城北有耶律奚底和萧讨古,更北靠西的得胜口有耶律斜轸;宋军方面,皇帝御驾亲征。
宋军先锋东西班指挥使傅潜、孔守正巡哨城北,在沙河遇到辽军,与之大战,耶律奚底、萧讨古战败,逃。耶律斜轸没有救援,而是伪装作收容逃兵的态势迷惑宋军,在宝光寺的赵光义,听探马来报,认为辽军现在没有准备好(收容败军,往往会扰乱本来阵容建制,不利作战),立马派军追击。
宋军追杀得尽兴,一路深入,耶律斜轸突然率军出现在宋军后方,宋军大乱,败退清沙河,并在清沙河与辽军对峙。
赵光义判断耶律斜轸兵力不多,留一部分兵力在清沙河,大军继续攻城。
六月二十六日,赵光义亲临幽州城北,先是率军击退清沙河的耶律斜轸部,而后于六月三十日开始继续攻城。
此时,辽景宗得知幽州被围,立马增援。耶律沙和耶律休哥分别率军向幽州进发。耶律休哥令耶律沙先至,与宋军在高粱河开战,佯装不敌宋军而败退,赵光义又一次指挥宋军乘胜追击。
耶律休哥率大军随后赶到,并没有直接对宋军发起进攻,而是利用耶律沙的败势,在宋军追击的路上埋伏,出其不意,手持双火把,突然杀出,宋军不知敌军虚实,顿时乱作一团,退至沙梁河,欲据河而守。
耶律休哥指挥战斗,令耶律斜轸右翼进攻,耶律沙重整部将,调头追击,亲率骑兵左翼进攻,幽州城守军得知援军已至,也开门列队迎敌。
宋军攻下北汉后,本已疲惫,未得丝毫犒赏,本来战意不佳;经过半个月猛攻幽州城,宋军更加疲惫;得知现在被辽军包围夹击,军心大乱,全线溃退,连夜败逃。
在此过程中,赵光义近臣找到一辆驴车,拉着赵光义一路南逃,仅用不到一日的时间,跑到了金台屯(来的时候,从金台屯到幽州用了五天时间),令其他退军难以望其项背,因此得了“高粱河车神”的绰号。
沙梁河之战,赵光义两次没有探明军情的情况下,轻率追击,两次败北。此一战,让中原王朝军民开始对比方契丹产生畏惧心理,成为宋辽关系的转折点,在以后宋辽相处的过程中,宋方始终处于下风。