use UNION ALL
SELECT UniqueID, key = key1, value = value1 from table
union all
SELECT UniqueID, key = key2, value = value2 from table
[EDIT] : below are sample script on how to make it Dynamic
Assumption : there must be a key / value pair
create table Table1
(
    UniqueID    int,
    key1        int,
    value1      varchar(10),
    key2        int,
    value2      varchar(10),
    key3        int,
    value3      varchar(10)
)
insert into Table1 select 1, 1, 'a', 2, 'b', 3, 'c'
insert into Table1 select 2, 5, 'e', 6, 'f', 7, 'g'
declare @sql    nvarchar(max)
; with 
col_key as
(
    select  key_col = c.name, rn = row_number() over (order by c.name)
    from    sys.columns c
    where   c.object_id = object_id('Table1')
    and c.name  like 'key%'
),
col_val as
(
    select  val_col = c.name, rn = row_number() over (order by c.name)
    from    sys.columns c
    where   c.object_id = object_id('Table1')
    and     c.name  like 'value%'
)
select  @sql    = isnull(@sql + ' UNION ALL' + char(13), '')
                + 'SELECT UniqueID, [key] = ' + k.key_col + ', [value] = ' + v.val_col + ' '
                + 'FROM Table1'
from    col_key k
        inner join col_val v    on  k.rn    = v.rn
print   @sql
exec    sp_executesql @sql
drop table Table1