Sql server SQL转换表w/UniqueID+;将多个键值对放入行中

Sql server SQL转换表w/UniqueID+;将多个键值对放入行中,sql-server,Sql Server,我有一个数据表: UniqueID |key1 |value1|key2|value2| 123 |1 |a |2 |c 234 |1 |b |2 |d 我希望它是: UniqueID|key|value 123 |1 |a 234 |1 |b 123 |2 |c 234 |2 |d 正在SQL Server中尝试执行此操作。使用UNION ALL SELECT UniqueID, key =

我有一个数据表:

UniqueID |key1 |value1|key2|value2|
123      |1    |a     |2   |c 
234      |1    |b     |2   |d
我希望它是:

UniqueID|key|value
123     |1  |a
234     |1  |b
123     |2  |c
234     |2  |d
正在SQL Server中尝试执行此操作。

使用UNION ALL

SELECT UniqueID, key = key1, value = value1 from table
union all
SELECT UniqueID, key = key2, value = value2 from table
[编辑]:下面是如何使其动态的示例脚本

假设:必须有一个键/值对

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
使用UNION ALL

SELECT UniqueID, key = key1, value = value1 from table
union all
SELECT UniqueID, key = key2, value = value2 from table
[编辑]:下面是如何使其动态的示例脚本

假设:必须有一个键/值对

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

非常快,谢谢你的回复。是否有更动态地执行此操作的方法?动态地
是什么意思?我的意思是,如果我有一个包含50个这样的键值对的表,是否有sql可以生成我的结果集,而无需手动硬编码列名。类似于这个()的东西。。但是它需要使用重复的键值对,这非常快,感谢您的回复。是否有更动态地执行此操作的方法?动态地
是什么意思?我的意思是,如果我有一个包含50个这样的键值对的表,是否有sql可以生成我的结果集,而无需手动硬编码列名。类似于这个()的东西。。但它需要处理重复的键值对