史萬歲長於騎射,602年12月,賀若弼在評價史萬歲之時譽之為「騎將」。他15歲隨父從軍,其父在北周武帝時戰死,他襲爵為太平縣公;北週末年因功被授予上大將軍。隋朝初年,因受到謀反的大將軍爾朱績的牽連,他被發配到敦煌成為一名戍卒;但就是這個「敦煌戍卒」卻讓當時雄霸北方的突厥聞之膽寒。
583年5月,隋朝秦州總管竇榮定率領九名總管步騎三萬兵出涼州,和突厥阿波可汗在高越原大戰,儘管阿波屢次戰敗,但其實力依然不可小覷。此時為敦煌戍卒的史萬歲便到竇榮定的軍門,請求為國效力,竇榮定早就聽說史萬歲的大名,一見面非常高興;同時也想盡早結束戰事,便心生一計。於是竇榮定與突厥約定「當各遣一壯士決勝負耳!」突厥當即答應。第二天,大軍擺開陣勢,突厥人派出一名驍勇善戰的騎將如旋風般地衝出陣營,只聽得鼓聲陣陣,軍士吶喊聲直衝雲霄!竇榮定見狀淡然一笑,向史萬歲略一點頭,史萬歲便拍馬而出。就在兩軍對兩名勇士要大戰幾百回合的精彩對決的期盼中,隋軍的鼓聲也是剛剛震天響起,史萬歲就「斬其首而還」。出去一陣風,提著突厥勇士的首級又一陣風般地馳回,所有的突厥人都驚呆了,他們心目中最勇猛的勇士就這樣一個回合都沒有便隕命當場。於是,阿波等再也不敢與隋軍對陣了,只能結盟撤軍;更重要的是在所有的突厥人心中永遠地留下了一個很難磨滅的「敦煌戍卒」的印象。
589年年初隋滅陳,但次年11月「陳之故境,大抵皆反」,隋文帝楊堅派遣楊素為行軍總管去江南平叛。楊素非常信任史萬歲,讓他率領兩千人,從婺州別道進軍。一開始還捷報頻傳,但逐漸地失去了與史萬歲的聯繫;當失聯長達一百天的時候,楊素等人都以為史萬歲肯定已經戰死沙場了。突然有一天,從河中取水做飯的士兵打撈上一個封存嚴密的竹筒,楊素打開竹筒,才得知史萬歲並未戰死,而且是「前後七百餘戰,轉斗千餘裡」。楊素將此事上奏隋文帝,楊堅感慨嘆賞再三,覺得史萬歲勇猛難得,便賞賜給史家十萬錢。失聯一百天,轉戰一千多里,取得一個又一個勝利,這就是史萬歲!
597年,南寧羌叛亂,隋文帝就直接任命史萬歲為行軍總管,率領大軍討伐叛軍。史萬歲從蜻蛉川進軍,直達南中。隋軍集結完畢,史萬歲立刻攻佔叛軍盤踞的一個又一個要塞,史載「皆擊破之」;而且乘勢深入,行軍一千多里「破其三十餘部,虜獲男女二萬餘口」。那些叛軍非常懼怕,便派遣使者請降,於是史萬歲刻石記功,在碑文中頌揚大隋的功德。但史萬歲也接受了懷有異志的爨翫的賄賂,而沒有把他押送回朝。結果第二年年底,南寧羌又反叛,蜀王楊秀便上奏楊堅,說「史萬歲受賂縱賊,致生邊患」,史萬歲一開始還狡辯不服,後來在事實面前才低頭認錯,隋文帝大怒「命斬之」,在高熲與元旻等人的勸解下,楊堅才沒有殺史萬歲,但死罪可免,活罪難除,又將他「除名為民」。當然,後來沒多久又官復原職。
600年4月,突厥達頭可汗率軍犯塞,楊堅下詔讓晉王楊廣等多軍出塞迎戰。史萬歲從馬邑道出塞,軍至大斤山,與達頭可汗相遇。達頭可汗派遣使者問:「隋將為誰?」偵測信息的騎兵回報:「史萬歲也。」達頭心頭一震,又問:「得非敦煌戍卒乎?」當聽到就是那個敦煌戍卒史萬歲的時候,達頭可汗冒出一身冷汗趕緊退兵。史萬歲「馳追百餘里,縱擊,大破之,斬數千級」,並且又乘勝追擊,深入大漠幾百裡,直到突厥軍隊「遠遁」才凱旋。這一戰,兩軍都未能擺開陣勢,一句「史萬歲也」便將突厥大軍打敗!但是回來後,等待他的不再是封賞,而是出自那位詩歌史上很有名的楊素嫉恨的謠言。可惜,當時的史萬歲還在想著如何向隋文帝為手下的將士論功爭賞,便被將史萬歲認為是廢太子楊勇的同黨的隋文帝直接讓人斬殺。儘管隋文帝也立即回味過來,但赦死之詔未到史萬歲已死,然後隋文帝還是下詔「陳其罪狀」。於是,天下「共冤惜之!」唐太宗李世民就曾經感慨「隋將史萬歲破達頭可汗,有功不賞,以罪致戮」。
《隋書》本傳記述史萬歲有「李廣之風」。史萬歲也確實與李廣有很多相似之處,有「李廣射虎」如此神勇的美名,就有史萬歲射雁的盛譽(史萬歲31歲時跟隨梁士彥征討尉遲迥的行軍途中,他在眾軍之前說要射雁群中的第三隻,結果箭發雁落)。史萬歲「令士卒各隨所安,無警夜之備,敵人亦不敢犯」的帶兵之術及效果與李廣極其相似,高熲就曾經一再感嘆:「史萬歲雄略過人,每行兵用師之處,未嘗不身先士卒,尤善撫御,將士樂為致力,雖古名將未能過也。」此點亦與李廣相同,與士卒同甘苦,衝鋒陷陣在前,食飲在士卒之後,因此能得士卒死力而戰無不勝了。