如何在一个带有动态列名的select语句中选择列名和值。

时间:2018-06-05 20:25:53

标签: sql sql-server

为了应用起见,这里的主要目标是在我的前端我希望能够从sql server表中提取字段数据并将其存储在我自己的数据库中。 (应用程序从数据库值创建数据文件)。但我想要元数据和

假设我的表FOO定义如下:

create  TABLE foo 
( id      INT NOT NULL
, col2    INT NOT NULL
, col3    VARCHAR(10) NULL
, col4    DATE NULL
, col5    DECIMAL(14,5) NULL
);

定义数据:

INSERT INTO foo (id, col2, col3, col4, col5) VALUES  
  (1,1,NULL,NULL,NULL)
,(2,2,'2','2/2/2012',22.22)
,(3,3,'3','3/3/2013',333.333)
,(4,4,NULL,'4/4/2014',4444.4444)
,(5,5,'5',NULL,55555.55555)
,(6,6,'6','6/6/2016',NULL);

假设这可以应用于我不知道列的任何表,我希望返回以下内容:

column_name | value
----------------------------
id          |   1
col2        |   1
col3        |   2
col4        |   2/2/2012
col5        |   22.22

所以基本上,我想要检索具有该列的第一个非null值的column_name,但是此时我将解决一个只返回第一个值的解决方案,即使它是null。

现在,我有一个查询来获取所有元数据,但我不知道如何在查询中添加另一列以获取该列名的数据。 (简化为仅拉取column_name,因为我还检索其他元数据)。同样,我必须动态地执行它,并且不能将其存储为过程。

SELECT 
    sc.name AS column_name
FROM
    sys.columns sc 
WHERE 
    sc.object_id = OBJECT_ID('FOO') 
ORDER BY 
    sc.column_id

我看到的所有答案都是非动态的,带有硬编码的列名,但我正在寻找一个选项,只需插入表名,它就可以跨表运行。我不确定它是否可能。即这solution

0 个答案:

没有答案