公元1041年2月,李元昊繼續開啟自己的對宋作戰攻略,率領號稱有100000人的部隊南下。此時的西夏國已經在河套大部、河西走廊和蒙古高原南部有很強影響力,但仍希望能將包括西安在內的整個關中盆地都收入囊中。因此將戰爭側重點逐步向西調整,并利用河流充當本方快速穿越荒漠環境的必要助力。
由于當時的氣候尚未轉暖,又已超越常規的冬季南下節奏,所以對循規蹈矩的宋軍來說無疑是種心理考驗。后者正處于本年度戰爭策略的制定過程中,也就不可能提前將更多援兵派往前沿位置。幾座重要城鎮都緊挨著六盤山建造,以期最大程度的回避騎兵弱項。
與此同時,西夏主力已順利沿著葫蘆河南下,并扎營在與之呈直角的好水川入口處。這樣做的好處既有緩解后勤壓力考量,也是為了能避開東面幾座山地城寨的宋軍耳目。李元昊便決定在腳下的這片河畔山谷設伏,想辦法將宋軍的有生力量吸引來消滅。為此,他還不惜派數千輕裝部隊提前分離,佯攻六盤山腳下的懷遠城。倘若有敵方的機動力量趕來解圍,就能引誘他們沿好水川向西深入埋伏圈。
當年2月13日,18000名北宋援軍就從固原趕來,跨過六盤山向突然告急的懷遠城挺進。由于是為應付靈活機動的黨項部族準備,所以有數千規模的輕重騎兵力量,比例遠超當時的許多內地同僚。但指揮官任福卻僅有前線執行權,必須受進士出生的大臣韓琦遙控。后者雖從未親自前往視察,卻早已在部隊開拔前就面授機宜,指點屬下如何繞到北面去抄西夏人后路。但陣中的大量步兵拖慢了全軍步伐,根本就來不及抓住對手,更沒可能在適宜地形上從容列隊。只是因為有新的敵情從南張義堡傳來,才匆匆調頭沿山麓向南側繼續追趕。
于是,任福又急忙率部追趕,力爭在友軍打跑西夏人之前加入戰斗。奈何苦苦奔走一整日,才抵達張義堡就獲悉自己還是來晚一步。加上不可靠的捷報謊稱對手已有數千人斃命,心態上難免出現變化,便順著敵軍軌跡沿河流向西瘋狂突進。其中,速度較快的騎兵隨自己沖鋒在前,在黃昏時分已抵達好水川流域。余下的步兵、輜重單位則全權交由部將朱觀和武英協同跟進,預備隔天到泉口處與他們一同夾擊。
至此,整支宋軍都已落入李元昊布下的天羅地網。不僅在長距離行進中出現步騎兵脫節現象,還依然對即將面臨的厄運沒有任何心理準備。
公元1041年2月14日上午,任福的先遣隊再度啟程追擊,卻很快在山谷地形內發現好幾個銀盒。出于好奇打開后,發現竟有不少鴿子從中飛出,成為通知對方伏兵的行動信號。隨后,大量西夏重裝部隊從山谷的另一側魚貫而出,開始對立足威武的宋軍騎兵實施沖鋒。雙方立即在狹窄的谷地內展開對攻,一度因實力相差不大而呈現出拉鋸之勢。
這主要是因為北宋軍中殘留的五代傳統,讓他們對精銳騎兵相當重視,不至于在短時間內丟掉陣地。同時,黨項人卻受限于國力不強、人口較少等問題,非常關注騎手的損耗問題。所以往往不樂于做過多激烈糾纏,時常需要稍稍后撤并進行休整重組。甚至不惜暫退出河谷緊要位置,給驚慌失措的宋軍以喘息之機。
然而,作為鐵桿主力的宋軍步兵卻根本來不及抵達戰場,只得任由己方騎兵在險境中自求多福。于是,大量原本只是在外圍擔負偵查、警戒任務的西夏輕裝部隊,開始集中到兩側展開共同夾擊。他們利用居高臨下的地形優勢,射出遮天蔽日的落頂箭矢,大量殺傷無馬甲保護的宋軍坐騎。等到獵物在包圍圈中的體能告罄,才紛紛從山頭俯沖而下,將只有千人的騎兵全部斬殺。
另一方面,由朱觀和武英率領的宋朝步兵輜重隊伍,也在北側的籠洛川遭遇阻擊。在沒有己方騎手增援的情況下,被迫呆在原地承受大量輕騎兵襲擾。即便眼前的西夏人數量不多,也不敢輕易嘗試戰場機動。直至南側的任福分隊全軍覆沒,才終于迎來更多追兵的群起攻之,并且因箭矢消耗完畢與體能不支而選擇撤退。期間,原本駐扎在西側羊牧隆城的宋軍亦有嘗試趕來解圍,卻同樣因機動能力太差而不得要領。只能退回原地駐守,坐看主力被西夏人瘋狂屠戮。但他們的突然攪局,還是幫朱觀等千余名潰兵逃脫,從而避免了全軍盡墨厄運。
由于這場好水川之戰的慘敗,宋朝的西北局勢變得愈發惡劣。盡管還能靠大量援軍暫時逼李元昊班師回朝,卻已無力對敵方腹地展開任何大規模攻勢。相反,1萬多人的損耗雖看似并不致命,實則對依賴城寨群進行層層布防的宋軍有很大影響。