2016-09-23 75 views
1

比方說,我在SQL 2014查詢:獲取查詢的列名在SQL Server

SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee 

我想動態經過查詢,循環並獲得列的名稱,比如EmployeeNameEmployeeAddressEmployeeAge

我需要這個,因爲我可以有比這我需要的列名,以及不同的另一個查詢。

+0

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

+0

在句子「我想動態地......」中,可以定義「我」嗎?我假設你不是指你,一個人(因爲你可以很容易地用你的眼睛掃描列名)。你在談論一段代碼嗎?它是用什麼語言編寫的,它是如何獲得結果集的? –

+0

你想底層db對象(表中的,即,等)的列名,或你想要的結果集的查詢(其可以包含任意合法的標識符名稱)的列名? – SlimsGhost

回答

0

你可以找到你的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子句,以獲得它爲所有表

0

好,因爲查詢可有得到解決,以「列」名字複雜的表達式,它們可以有任意名稱(只要他們是合法的標識符),你正在尋找一個與字符串解析派對!

通常,列名/別名將位於列表達式的末尾(逗號或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

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 
) 
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 
+0

這是唯一可以解決問題的答案 – Laurence