Anda dapat melakukannya menggunakan fungsi PATINDEX() seperti di bawah ini :
select * from Test
order by CAST(SUBSTRING(Name + '0', PATINDEX('%[0-9]%', Name + '0'), LEN(Name + '0')) AS INT)
Demo Fiddle SQL
Jika Anda memiliki angka di tengah string maka Anda perlu membuat fungsi kecil yang ditentukan pengguna untuk mendapatkan nomor dari string dan mengurutkan data berdasarkan angka tersebut seperti di bawah ini :
CREATE FUNCTION dbo.fnGetNumberFromString (@strInput VARCHAR(255))
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @intNumber int
SET @intNumber = PATINDEX('%[^0-9]%', @strInput)
WHILE @intNumber > 0
BEGIN
SET @strInput = STUFF(@strInput, @intNumber, 1, '')
SET @intNumber = PATINDEX('%[^0-9]%', @strInput)
END
RETURN ISNULL(@strInput,0)
END
GO
Anda dapat mengurutkan data berdasarkan :
select Name from Test order by dbo.fnGetNumberFromString(Name), Name