Try something like this:
DECLARE @test table (ID int, A1 int, A2 int, A3 int)
INSERT INTO @test VALUES(1, 1, NULL, 3)
INSERT INTO @test VALUES(2, 1, 2, 3)
INSERT INTO @test VALUES(3, NULL,2 , NULL)
DECLARE @temp table (id int, val int)
DECLARE @id int
DECLARE eachRow CURSOR FOR
SELECT ID, A1, A2, A3 FROM @test WHERE A1 IS NULL OR A2 IS NULL OR A3 IS NULL
DECLARE @rowID int, @A1 int, @A2 int, @A3 int
OPEN eachRow
WHILE 0 = 0
BEGIN
FETCH NEXT FROM eachRow INTO @rowID, @A1, @A2, @A3
IF @@FETCH_STATUS != 0 BEGIN BREAK END
DELETE FROM @temp
SET @id = 1
IF @A1 IS NOT NULL
BEGIN
INSERT INTO @temp VALUES(@id, @A1)
END
SELECT @id = ISNULL((SELECT MAX(id) + 1 FROM @temp), 1)
IF @A2 IS NOT NULL
BEGIN
INSERT INTO @temp VALUES(@id, @A2)
END
SELECT @id = ISNULL((SELECT MAX(id) + 1 FROM @temp), 1)
IF @A3 IS NOT NULL
BEGIN
INSERT INTO @temp VALUES(@id, @A3)
END
SELECT @id = ISNULL((SELECT MAX(id) + 1 FROM @temp), 1)
SELECT @A1 = NULL, @A2 = NULL, @A3 = NULL
SELECT @A1 = val FROM @temp WHERE id = 1
SELECT @A2 = val FROM @temp WHERE id = 2
SELECT @A3 = val FROM @temp WHERE id = 3
UPDATE @test SET
A1 = @A1, A2 = @A2, A3 = @A3
WHERE
ID = @rowID
END
CLOSE eachRow
DEALLOCATE eachRow
SELECT * FROM @test
I created a table variable to test with (I only used A1 through A3, but you can extend it to be through A6). You will want to ensure your table has an ID field with an index on it. Also, you may want to add an index to the temporary table variable I used in my example if the number of fields you have is large. If you actually have 6 rows, then you shouldn't need an index on the temporary table variable.