• 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


    Forever trying to learn
    My blog - http://www.cadavre.co.uk/
    For better, quicker answers on T-SQL questions, click on the following...http://www.sqlservercentral.com/articles/Best+Practices/61537/
    For better, quicker answers on SQL Server performance related questions, click on the following...http://www.sqlservercentral.com/articles/SQLServerCentral/66909/