使用T-SQL中的列名和相应的值检索值

时间:2015-11-17 13:34:19

标签: sql-server sql-server-2008 tsql

我需要一个select语句,它将在第一个结果列中给出列名,并在Query的下一个结果列中给出相应的值。图像是指样本表。 Test Table

当我从测试表中检索ID 1的值时。它必须给出像

这样的结果集

Result set

我需要得到一个合适的结果,即使列名不同,列名中也没有类似的前缀或后缀。即使表中的列被修改意味着添加/删除,我也不想更改查询以获得结果。

3 个答案:

答案 0 :(得分:1)

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.column_name)
           from information_schema.columns as C
           where C.table_name = 'yourtable' and
                 C.column_name like 'Val%'
           for xml path('')), 1, 1, '')

set @query 
  = 'select id,
        valname,
        valvalue
     from yourtable
     unpivot
     (
        valvalue
        for valname in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

编辑: 如果你只有第一列固定反向where子句:

...
          where C.table_name = 'yourtable' and
                 C.column_name != 'ID'
...

但必须给予所有学分 SSQL Server : Columns to Rows

答案 1 :(得分:0)

你可以点击主表但可能有点复杂。

最简单的方法就是对列进行硬编码:

Select 'id1', val1 'STEP1', val2 'test2', val3 from [table]

请不要在列名中加上空格。

答案 2 :(得分:0)

SQL Server 2016 (13.x) 及更高版本

declare @sql nvarchar(max);

set @sql = (select [YOUR_COL_NAMES] from [YOUR_TABLE_NAME] WHERE [CONDITION] for json auto , WITHOUT_ARRAY_WRAPPER);

select * from openjson(@sql)