获取查询的列名在SQL Server

问题描述:

比方说,我在SQL 2014查询:获取查询的列名在SQL Server

SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee 

我想动态经过查询,循环并获得列的名称,比如EmployeeNameEmployeeAddressEmployeeAge

我需要这个,因为我可以有比这我需要的列名,以及不同的另一个查询。

+0

看看sys.tables和sys.columns。 – scsimon

+0

在句子“我想动态地......”中,可以定义“我”吗?我假设你不是指你,一个人(因为你可以很容易地用你的眼睛扫描列名)。你在谈论一段代码吗?它是用什么语言编写的,它是如何获得结果集的? –

+0

你想底层db对象(表中的,即,等)的列名,或你想要的结果集的查询(其可以包含任意合法的标识符名称)的列名? – SlimsGhost

你可以找到你的talbes像这样的列名...

select t.name as TableName, c.Name as ColumnName 
from sys.tables t 
inner join sys.columns c on c.object_id = t.object_id 
where t.name = 'yourTable' 

所以,你可以在光标把这个包做每个表名称,或只是删除WHERE子句,以获得它为所有表

好,因为查询可有得到解决,以“列”名字复杂的表达式,它们可以有任意名称(只要他们是合法的标识符),你正在寻找一个与字符串解析派对!

通常,列名/别名将位于列表达式的末尾(逗号或FROM子句的开始处),或者某些dbms允许您也执行“select myname = a + b, anothername = c + d,...“,你通常也可以有匿名列。

尽管如此,在最外层的selectfrom之前的所有内容)中,您应该可以通过逗号进行拆分,然后查找逗号前面的最后一个字符串“token”(并在前面加上“as”或者只是空格),和失败,你可以寻找“colname的=”部分作为第二遍,然后根据故障安全采取的原始表达的前n个字符,并使用你的“匿名”的名字。

这是查询分析器是如何工作毕竟,所以它不是不可能的,但我不希望有代码吧!该覆盖任何法律查询所需的复杂性将是艰巨的。

对于笑声,尝试只是这些变异的解析规则在想:

select col1 as NOTCOL1, col2 from table 

select col1 + 1, col3=col2 from table 

with x as (
    select something from somewhere 
) 
select something as [Something with spaces for good measure] from x 

select a.x, (b.col1) "look, a rainbow!" 
from ( 
    select col1 as x 
    from reused_table 
) a 
cross join reused_table b 
+2

而不是解析字符串数周,您可以将查询插入临时表,然后从tempdb.sys.columns中读取列名。 :) –

+0

哈!我总是跳到解析其他东西,如表达式本身,但当然你是对的,如果你只是想要的名字!感谢让我回到现实。 – SlimsGhost

这将返回一个逗号分隔的列清单名为其中的表。

SELECT  
(
SELECT DISTINCT STUFF((SELECT ',' + isc.name + '' 
FROM sys.columns isc 
WHERE OBJECT_NAME(isc.object_id) = 'TableName' FOR XML PATH('')), 1,1,'') 
AS SqlScript 
) 

sp_describe_first_result_set存储过程会给你的列名和任何查询更多。您只需将相关查询传递给@tsql参数即可。 请看下面的例子使用存储过程:

DECLARE @queryDescription TABLE 
(
    s_hidden      bit    NULL 
    ,column_ordinal     int    NULL 
    ,name       sysname   NULL 
    ,is_nullable     bit    NULL 
    ,system_type_id     int    NULL 
    ,system_type_name    nvarchar(256) NULL 
    ,max_length      smallint  NULL 
    ,precision      tinyint   NULL 
    ,scale       tinyint   NULL 
    ,collation_name     sysname   NULL 
    ,user_type_id     int    NULL 
    ,user_type_database    sysname   NULL 
    ,user_type_schema    sysname   NULL 
    ,user_type_name     sysname   NULL 
    ,assembly_qualified_type_name nvarchar(4000) NULL 
    ,xml_collection_id    int    NULL 
    ,xml_collection_database  sysname   NULL 
    ,xml_collection_schema   sysname   NULL 
    ,xml_collection_name   sysname   NULL 
    ,is_xml_document    bit    NULL 
    ,is_case_sensitive    bit    NULL 
    ,is_fixed_length_clr_type  bit    NULL 
    ,source_server     sysname   NULL 
    ,source_database    sysname   NULL 
    ,source_schema     sysname   NULL 
    ,source_table     sysname   NULL 
    ,source_column     sysname   NULL 
    ,is_identity_column    bit    NULL 
    ,is_part_of_unique_key   bit    NULL 
    ,is_updateable     bit    NULL 
    ,is_computed_column    bit    NULL 
    ,is_sparse_column_set   bit    NULL 
    ,ordinal_in_order_by_list  smallint  NULL 
    ,order_by_list_length   smallint  NULL 
    ,order_by_is_descending   smallint  NULL 
    ,tds_type_id     int    NULL 
    ,tds_length      int    NULL 
    ,tds_collation_id    int    NULL 
    ,tds_collation_sort_id   tinyint   NULL 

) 


DECLARE @query NVARCHAR(MAX) = 'SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee' 

INSERT INTO @queryDescription 
EXEC sp_describe_first_result_set @tsql = @query 


SELECT Name AS ColumnName 
     ,system_type_name AS DataTypeName 
     ,column_ordinal AS Ordinal 
FROM @queryDescription 
+0

这是唯一可以解决问题的答案 – Laurence