Here's another alternative you could try:
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
DROP TABLE #TempTable
CREATE TABLE #TempTable (
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[StatusID] [int] NULL,
PRIMARY KEY (ID))
INSERT INTO #TempTable
SELECT 'George','Washington','1'
UNION ALL SELECT 'John','Adams','2'
UNION ALL SELECT 'Thomas','Jefferson','3'
UNION ALL SELECT 'James','Madison','4'
UNION ALL SELECT 'James','Monroe','5'
UNION ALL SELECT 'Andrew','Jackson','6'
UNION ALL SELECT 'John Quincy','Adams','7'
--Original order
SELECT * FROM #TempTable ORDER BY ID
--Order by this string order
DECLARE @SortOrder VARCHAR(50)
SET @SortOrder = '3,2,4,5,1,6,7'
SELECT
ID
,FirstName
,LastName
,StatusID
FROM
#TempTable AS tt
INNER JOIN
dbo.DelimitedSplit8K(@SortOrder,',') AS dsk
ON tt.StatusID = dsk.Item
For those who don't have the DelimitedSplit8K function already:
CREATE FUNCTION [dbo].[DelimitedSplit8K]
(
@pString VARCHAR(8000)
,@pDelimiter CHAR(1)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
WITH E1(N)
AS (
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
UNION ALL
SELECT
1
),--10E+1 or 10 rows
E2(N)
AS (
SELECT
1
FROM
E1 a
,E1 b
),--10E+2 or 100 rows
E4(N)
AS (
SELECT
1
FROM
E2 a
,E2 b
),--10E+4 or 10,000 rows max
cteTally(N)
AS (
SELECT TOP (ISNULL(DATALENGTH(@pString),0))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM E4
),
cteStart(N1)
AS (
SELECT
1
UNION ALL
SELECT
t.N + 1
FROM
cteTally t
WHERE
SUBSTRING(@pString,t.N,1) = @pDelimiter
),
cteLen(N1,L1)
AS (
SELECT
s.N1
,ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0) - s.N1,8000)
FROM
cteStart s
)
SELECT
ItemNumber = ROW_NUMBER() OVER (ORDER BY l.N1)
,Item = SUBSTRING(@pString,l.N1,l.L1)
FROM
cteLen l ;
GO