获取查询的列名在SQL Server
比方说,我在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