【问题标题】:Getting List of Columns from a SQL Select statement从 SQL Select 语句中获取列列表
【发布时间】:2013-10-09 00:08:20
【问题描述】:

我想知道是否有办法从 SQL 语句中获取列的列表。例如,我有一个简单的 SQL 语句,例如“Select FirstName, LastName From Customer”,我想获取 SQL 语句中返回的列的列表,在本例中为 FirstName 和 LastName。 SQL 语句是动态的,因此直到运行时才知道。

目前我通过在数据库中动态创建一个视图而不是使用:

SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name = @viewName

比我放弃视图。

这对于仅获取 select 语句的列来说似乎有点戏剧性。

关于如何在不创建和删除视图的情况下执行此操作的任何想法?

提前致谢

【问题讨论】:

  • 为什么不使用字符串操作技术从查询中提取列名?比如 SQLQuery.substring...? sql server 中需要这些列名吗?
  • 嗨 mpakbaz,问题是列开始之前的 sql 组合非常大。此外,sql 定义永远不会是一个完美的名称,而不是逗号,它可能是一个带有 AS 字段映射的计算字段或一个非命名列,比如 EXPR1 类型。
  • 不提前知道栏目?你想做什么?

标签: sql sql-server database sql-server-2008


【解决方案1】:

我经常使用一种非常狡猾的技术,在这种情况下使用错误条件进行选择,例如

Select ..... Where 1=0

这会以相当快的速度返回包含所有列但没有行的结果集。因此,如果在可视化环境中运行,您可以看到您拥有哪些列,并且如果从程序/脚本运行,则所有正常的列访问工具都可用。

【讨论】:

    【解决方案2】:

    您应该可以为此使用SET FMTONLY

    SET FMTONLY ON;
    (run your query)
    SET FMTONLY OFF;
    

    启用“仅格式”时,SQL Server 不会实际运行查询;它只是返回一个与查询具有相同格式的空结果集(即所有列,只是没有行)。然后,您可以使用您正在使用的任何客户端 API 调查列的架构(例如,如果您使用的是 .NET,则可以使用 SqlDataReader.FieldCount、GetFieldType 和 GetName)。

    正如我在上面喜欢的文档页面上所述,SET FMTONLY 在 SQL Server 2012 中已弃用;因此,如果您以后将应用升级到 2012,他们会推荐 sp_describe_first_result_set

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2017-09-26
      • 2013-12-29
      • 2021-02-28
      相关资源
      最近更新 更多