Didn't have time for perf-tuning last night, but this morning I quickly knocked up a conversion between the table from the SQL Challenge to a string so the rest of the code doesn't require modifying. Like you, I doubt that a normal user of the script will want to input the Sudoku puzzles into a table so I wanted to leave the functionality for a string input in there.
DECLARE @FromTable INT, --1 means from TC63, else from string
@SudokuGivens VARCHAR(100), @SudokuNo INT
--Intention is to have these values in a proc, with @SudokuGivens and @SudokuNo
--as variable parameters
SET @FromTable = 1
SET @SudokuNo = 1
--SET @SudokuGivens = ' 3 89 3 5422 87 5 2 4 17 1 895 6 63 1 8 4 24 5324 6 18 6 '
IF @SudokuNo IS NULL
BEGIN
SET @SudokuNo = 1 --Default value
END
IF @FromTable = 1
BEGIN
--Put table into string
SELECT @SudokuGivens = COALESCE(@SudokuGivens, '') + Data
FROM (SELECT b.SudokuNo, b.Row, N AS Col, ISNULL(MAX(CONVERT(VARCHAR(MAX),b.Data)),' ') AS Data
FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) a(N)
CROSS APPLY (SELECT SudokuNo, Row, Col, Data
FROM TC63
WHERE a.N = Col AND SudokuNo = @SudokuNo
UNION
SELECT SudokuNo, Row, Col, NULL
FROM TC63
WHERE a.N <> Col AND SudokuNo = @SudokuNo) b
GROUP BY b.SudokuNo, b.Row, N) a
ORDER BY a.Row
END
;WITH Solve(solution, ind ) AS (
SELECT @SudokuGivens, Charindex(' ', @SudokuGivens, 1) UNION ALL
SELECT CAST(Substring(solution, 1, ind - 1) + CAST(N AS VARCHAR(1)) + Substring(solution, ind + 1, 81) AS VARCHAR(100)),
Charindex(' ', solution, ind + 1)
FROM Solve, (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS a(N)
WHERE ind > 0
AND NOT EXISTS (SELECT NULL FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS b(Nn)
WHERE N = Substring(solution, ( ( ind - 1 ) / 9 ) * 9 + Nn, 1)
OR N = Substring(solution, ( ( ind - 1 ) % 9 ) - 8 + Nn * 9, 1)
OR N = Substring(solution, ( ( ( ind - 1 ) / 3 ) % 3 ) * 3 + ( ( ind - 1 ) / 27 ) * 27 + Nn + ( ( Nn - 1 ) / 3 ) * 6 , 1))
)
SELECT @SudokuNo AS SudokuNo, PVT.rowNumber AS [Row/Col],PVT.[1],PVT.[2],PVT.[3],PVT.[4],PVT.[5],PVT.[6],PVT.[7],PVT.[8],PVT.[9]
FROM (SELECT solutionSet.rowNumber, Row_Number() OVER (Partition BY solutionSet.rowNumber ORDER BY solutionSet.workSolution) AS ColNo,
SUBSTRING(solutionSet.workSolution, ROW_NUMBER() OVER (Partition BY solutionSet.rowNumber ORDER BY solutionSet.workSolution), 1) AS DATA
FROM (SELECT ROW_NUMBER() OVER (ORDER BY solution) AS rowNumber,
SUBSTRING(solution, ROW_NUMBER() OVER (ORDER BY solution) * 9 - 8,
ROW_NUMBER() OVER (ORDER BY solution) * 9 - (ROW_NUMBER() OVER (ORDER BY solution) * 9 - 9)) AS workSolution
FROM Solve
CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) a(N)
WHERE ind = 0) solutionSet
CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) a(N)) prePVT
PIVOT (MAX(prePVT.DATA) FOR ColNo IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])) PVT