见叛军势大,张寔征调天下兵马至关中,以征三王叛军。时大军云集十万,交由漠南将军高恕远统率,两军对峙于好水川。张铧巧施离间计,让张寔调走名将高恕远,换上刘芝为帅。
天寿二十年(302年),张铧大破刘琨于好水川,十万唐军惨败,尸首相枕,血流成河。危难之下,在裴秀的举荐下,选用祖逖为司隶校尉,负责关中战事。而张寔却是惊走洛阳,再诏天下兵马讨贼。
三王叛军气势大涨之际,诸藩王各怀忤逆之心,以各种理由搪塞兵马召集。典型如建安郡王张罕、交趾郡王张玷、沧海郡王张拚、牂柯郡王张高之等,暗中招兵买马,以各种理由侵吞临近郡县。
祖逖坐镇关中,用离间计令张铧诛杀张绦,让张荥生疑之下,以并州兵进犯为由,返回云中国。失去精锐的云中义从,张铧独臂难支,遂遁走陇右。
天寿二十二年(304年),在张寔的支持下,祖逖率精兵五万翻越陇山征讨张铧,刘琨率精兵三万征讨云中王张荥。
因天水郡守姜洮拒城不降,令祖逖轻易进入陇右。经祖逖长达一年的作战,将张铧驱逐出陇右,率兵远逃至河湟。
恰时,张寔驾崩于雒阳,太子张粲在太原继位。而叛军见形势不利,内部陷入纷争之中,张铧之弟张檀杀张铧,向张粲乞降;张荥被刘琨击败并斩杀,子张肜上疏求降。
张粲急于平定天下,本欲同意张檀、张肜二人请求,但祖逖却上疏反驳,言‘贼寇不亡,则西北动荡;西北不服,西都难平’。张粲采纳祖逖之计,下令二将继续征讨。
永和元年(305年),祖逖深入西海,诛杀张檀,降服从叛诸夷;刘琨离间从叛鲜卑,破擒张肜,安抚河朔近塞诸胡。
三王叛乱虽被镇压,但长达五年的混战,让关西经济凋敝,人口死伤颇多,中央权威受到挑战,唐朝盛世一去不复返。
张粲性情宽厚,自诩以撤藩改郡之失为鉴,不断怀柔边藩诸侯,以避免引起新的叛乱。且为了安稳叛乱边国,除云中国直属中央,灵武、西平仍由子侄为藩统治。然因行事宽和,纵容宰相擅权,虽一定程度上恢复了中央秩序,但未能中兴唐朝。
永和十五年(320年),张粲患病垂危,皇后杨氏专权,与其弟杨珧交通内外,树立党羽,借张粲之名改易公卿,任用心腹。张粲临终前,担忧杨氏为乱,欲以魏国公祖逖、幽国公刘琨,与杨珧共辅太子。
杨珧截藏诏书,欲独领顾命之托