Instead of use a CURSOR I'd suggest you to use an iterative solution using WHILE.
CREATE TABLE MEASURES (id int, id_column1 int, id_column2 int, id_column3 int, stuff varchar(20)); INSERT INTO MEASURES VALUES (1, 2017, 2024, 1452, 'red'), (2, 4125, NULL, 5234, 'blue'), (3, NULL, 5234, 7234, 'pink'); GO
3 rows affected
CREATE TABLE BRIDGE (id int, idc int); GO
✓
DECLARE @idColumn INT = 1; DECLARE @cmd VARCHAR(MAX) = ''; WHILE @idColumn <= 3 BEGIN SET @CMD = 'INSERT INTO BRIDGE' + ' SELECT id, id_column' + CAST(@idColumn AS VARCHAR(10)) + ' FROM MEASURES' -- uncomment to remove NULL values --+ ' WHERE id_column' --+ + CAST(@idColumn AS VARCHAR(10)) --+ ' IS NOT NULL;'; EXEC (@CMD); SET @idColumn = @idColumn + 1; -- uncomment to check SQL statements --SELECT @CMD; END SELECT * FROM BRIDGE ORDER BY id; GO
id | idc -: | ---: 1 | 2017 1 | 2024 1 | 1452 2 | 5234 2 | null 2 | 4125 3 | null 3 | 5234 3 | 7234
dbfiddle here