Vous pouvez le faire en utilisant la fonction PATINDEX() comme ci-dessous :
select * from Test
order by CAST(SUBSTRING(Name + '0', PATINDEX('%[0-9]%', Name + '0'), LEN(Name + '0')) AS INT)
Démo SQL Fiddle
Si vous avez des nombres au milieu de la chaîne, vous devez créer une petite fonction définie par l'utilisateur pour obtenir le nombre de la chaîne et trier les données en fonction de ce nombre comme ci-dessous :
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
Vous pouvez trier les données par :
select Name from Test order by dbo.fnGetNumberFromString(Name), Name