比方說,我在SQL 2014查詢:獲取查詢的列名在SQL Server
SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee
我想動態經過查詢,循環並獲得列的名稱,比如EmployeeName
, EmployeeAddress
和EmployeeAge
。
我需要這個,因爲我可以有比這我需要的列名,以及不同的另一個查詢。
比方說,我在SQL 2014查詢:獲取查詢的列名在SQL Server
SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee
我想動態經過查詢,循環並獲得列的名稱,比如EmployeeName
, EmployeeAddress
和EmployeeAge
。
我需要這個,因爲我可以有比這我需要的列名,以及不同的另一個查詢。
你可以找到你的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,...「,你通常也可以有匿名列。
儘管如此,在最外層的select
(from
之前的所有內容)中,您應該可以通過逗號進行拆分,然後查找逗號前面的最後一個字符串「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
而不是解析字符串數週,您可以將查詢插入臨時表,然後從tempdb.sys.columns中讀取列名。 :) –
哈!我總是跳到解析其他東西,如表達式本身,但當然你是對的,如果你只是想要的名字!感謝讓我回到現實。 – 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
這是唯一可以解決問題的答案 – Laurence
看看sys.tables和sys.columns。 – scsimon
在句子「我想動態地......」中,可以定義「我」嗎?我假設你不是指你,一個人(因爲你可以很容易地用你的眼睛掃描列名)。你在談論一段代碼嗎?它是用什麼語言編寫的,它是如何獲得結果集的? –
你想底層db對象(表中的,即,等)的列名,或你想要的結果集的查詢(其可以包含任意合法的標識符名稱)的列名? – SlimsGhost