假设我在SQL 2014中有一个查询:
SELECT EmployeeName, EmployeeAddress, EmployeeAge FROM dbo.Employee
我想动态浏览查询,循环并获取EmployeeName
,EmployeeAddress
和EmployeeAge
等列的名称。
我需要这个,因为我可以有另外一个不同的查询我需要获取列名。
答案 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,...",您通常也可以使用匿名列。
尽管如此,在最外面的select
(from
之前的所有内容)中,您应该能够用逗号分割,然后查找最后一个字符串" 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的结果窗格的左上角单击鼠标右键,然后选择带标题复制。
粘贴到excel或文本文件中以获得标题名称。