获取SQL Server中的查询的列名称

时间:2016-09-23 19:45:47

标签: sql-server sql-server-2014

假设我在SQL 2014中有一个查询:

SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee

我想动态浏览查询,循环并获取EmployeeNameEmployeeAddressEmployeeAge等列的名称。

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

你可以找到你的talbe的列名......就这样......

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子句以获取所有表

答案 2 :(得分:0)

好吧,因为查询可以有复杂的表达式,可以解析为" column"名称,他们可以有任意名称(只要他们是合法的标识符),你正在寻找一个字符串解析方!

通常,列名/别名将位于列表达式的末尾(在逗号之前或FROM子句的开头之前),或者某些dbms允许您也执行"选择myname = a + b,anothername = c + d,...",您通常也可以使用匿名列。

尽管如此,在最外面的selectfrom之前的所有内容)中,您应该能够用逗号分割,然后查找最后一个字符串" token"这是在逗号之前(并以"作为"或只是空格)之前,并且未能找到" 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

答案 3 :(得分:0)

这将返回以逗号分隔的列表,列出其中名为的表。

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
)

答案 4 :(得分:0)

这是从TSQL查询中获取列名的一种方法。

将查询内容包装在common table expression (cte)内:

;with cteQueryresult
as
(
  SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee
)

从结果中选择几行:

select top 3 * from cteQueryresult

然后在Management Studio的结果窗格的左上角单击鼠标右键,然后选择带标题复制

enter image description here

粘贴到excel或文本文件中以获得标题名称。