Sql 是否可以将所有列作为行返回,并在第二列中返回它们的值?

Sql 是否可以将所有列作为行返回,并在第二列中返回它们的值?,sql,sql-server,Sql,Sql Server,我试图创建一些用于审计的报告,但我有一个非常具体的问题 大约有120列,每列都有一个特定的数字答案。我想返回列名和该列行的值。我知道我会得到很多结果,但这不是问题 例如,我有: KEY |ColumnA | ColumnB 1 |Value A | ValueB 2 |ValueA2 | ValueB2 但我想要的是: 1 |ColumnA | Value A 2 |ColumnA | Value A2 1 |ColumnB | Value B 2 |Colum

我试图创建一些用于审计的报告,但我有一个非常具体的问题

大约有120列,每列都有一个特定的数字答案。我想返回列名和该列行的值。我知道我会得到很多结果,但这不是问题

例如,我有:

KEY |ColumnA | ColumnB
1   |Value A | ValueB
2   |ValueA2 | ValueB2
但我想要的是:

1    |ColumnA | Value A
2    |ColumnA | Value A2
1    |ColumnB | Value B
2    |ColumnB | Value B2


我已尝试返回所有行,然后自行连接,但它没有提供我所需的输出。

以下查询应满足您的要求-您需要对列名进行自定义排序:

CREATE TABLE #temp (ColumnA VARCHAR(20), ColumnB VARCHAR(20))

INSERT INTO #temp VALUES ('Value A','Value B'),('Value A2','Value B2')

SELECT t.Col, t.Val
FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) RNO FROM #temp t) tmp
CROSS APPLY (VALUES (tmp.ColumnA,'ColumnA',tmp.RNO),(tmp.ColumnB,'ColumnB',tmp.RNO)) AS T(Val,Col,sort)
ORDER BY T.Col, Sort
结果如下:

Col       Val
ColumnA   Value A
ColumnA   Value A2
ColumnB   Value B
ColumnB   Value B2

它很简单…如果你知道列名,你可以使用一个简单的联合

SELECT * FROM tblAuditing


SELECT 'ColumnA' AS ColumnA,'ColumnB' AS ColumnA UNION
SELECT ColumnA AS ColumnA,ColumnB AS ColumnA FROM tblAuditing

简单的
unpivot
将完成这项工作:)


谢谢我需要声明我想要的每一列吗?当前有一个键绑定行,我需要保留它。我已经更新了我的示例。很抱歉你是最棒的!谢谢
declare @tbl table ([Key] int, ColumnA varchar(15), ColumnB varchar(15));
insert into @tbl values
(1, 'Value A', 'ValueB'),
(2, 'ValueA2', 'ValueB2');

select [key], [column], [value] from
(select * from @tbl) p
unpivot 
([value] for [column] in (ColumnA, ColumnB)) u
order by [column]