You don't really need a loop to do this. An ordinary set based query will suffice.This example presumes your IDENTITY column is named PictID and the path to the picture is named Path.Use the following code for zero-based IDENTITYSELECT PictID / 4 PictRow, MAX(CASE WHEN PictID % 4 = 0 THEN Path ELSE NULL END) Col0, MAX(CASE WHEN PictID % 4 = 1 THEN Path ELSE NULL END) Col1, MAX(CASE WHEN PictID % 4 = 2 THEN Path ELSE NULL END) Col2, MAX(CASE WHEN PictID % 4 = 3 THEN Path ELSE NULL END) Col3FROM PicTableGROUP BY PictID / 4ORDER BY PictID / 4
And use following code for one-based IDENTITYSELECT (PictID - 1) / 4 PictRow, MAX(CASE WHEN (PictID - 1) % 4 = 0 THEN Path ELSE NULL END) Col0, MAX(CASE WHEN (PictID - 1) % 4 = 1 THEN Path ELSE NULL END) Col1, MAX(CASE WHEN (PictID - 1) % 4 = 2 THEN Path ELSE NULL END) Col2, MAX(CASE WHEN (PictID - 1) % 4 = 3 THEN Path ELSE NULL END) Col3FROM PicTableGROUP BY (PictID - 1) / 4ORDER BY (PictID - 1) / 4
Or to be on the safe side, for example if there is many gaps in the Picture IDENTITY column,DECLARE @t TABLE (ID INT IDENTITY (0, 1), Path VARCHAR (256))INSERT @t (Path)SELECT PathFROM PictTableORDER BY PictIDSELECT ID / 4 PictRow, MAX(CASE WHEN ID % 4 = 0 THEN Path ELSE NULL END) Col0, MAX(CASE WHEN ID % 4 = 1 THEN Path ELSE NULL END) Col1, MAX(CASE WHEN ID % 4 = 2 THEN Path ELSE NULL END) Col2, MAX(CASE WHEN ID % 4 = 3 THEN Path ELSE NULL END) Col3FROM @tGROUP BY ID / 4ORDER BY ID / 4