【问题标题】:How to retrieve field names from temporary table (SQL Server 2008)如何从临时表中检索字段名称 (SQL Server 2008)
【发布时间】:2010-10-19 20:33:36
【问题描述】:

我使用的是 SQL Server 2008。假设我创建了一个像这样的临时表:

create table #MyTempTable (col1 int,col2 varchar(10))

如何动态检索字段列表?我想看到这样的东西:

Fields:
col1
col2

我正在考虑查询 sys.columns,但它似乎没有存储任何有关临时表的信息。有什么想法吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 temp-tables


    【解决方案1】:
    select * from tempdb.sys.columns where object_id =
    object_id('tempdb..#mytemptable');
    

    【讨论】:

    • 好答案。使用select name from tempdb.sys.tables获取所有临时表名
    • 已验证此方法不会从通过不同连接创建的#temp 表返回数据。使用 LIKE #temp% 的替代方案可以。
    【解决方案2】:
    select * 
    from tempdb.INFORMATION_SCHEMA.COLUMNS
    where table_name like '#MyTempTable%'
    

    【讨论】:

    • 这个答案更好。包括表名以及列的数据类型。如果您的 where 子句包含一个临时表列表,那么这会更加优越,因为您可以区分哪些列来自哪个临时表
    • @VISQL 实际上,接受的答案更好,因为它不使用INFORMATION_SCHEMA。您可以通过 JOINing 到 sys.types 轻松获取数据类型,并且您可以轻松地通过 OBJECT_NAME( object_id , database_id ) 或 JOINing 到 tempdb.sys.tables 获取表名。这就是 INFORMATION_SCHEMA 视图所做的一切。
    • 这样做的问题是,如果您使用 2 个名称相似的临时表(例如 #TEMP1 和 #TEMP12),那么当使用 #TEMP1 作为表名时,您还将获得 #TEMP12 的列
    • 使用 '#MyTempTable[][][_]%' 可以更好地确保您不会获得以您要查找的表的名称开头的其他表
    • 被否决为:验证接受的答案不会从通过不同连接创建的#temp 表返回数据。这个方法可以。接受的答案更安全。
    【解决方案3】:

    使用 information_schema 并且不与其他会话冲突:

    select * 
    from tempdb.INFORMATION_SCHEMA.COLUMNS
    where table_name =
        object_name(
            object_id('tempdb..#test'),
            (select database_id from sys.databases where name = 'tempdb'))
    

    【讨论】:

      【解决方案4】:

      临时表在“tempdb”中定义,表名是“mangled”。

      这个查询应该可以解决问题:

      select c.*
      from tempdb.sys.columns c
      inner join tempdb.sys.tables t ON c.object_id = t.object_id
      where t.name like '#MyTempTable%'
      

      马克

      【讨论】:

      • 我认为这可以跨越范围。如果是一次性密码就好了。如果它的代码将有一个真实的生命周期,那么问题。
      • 是的,糟糕的解决方案 - 如果多个连接创建了同名的临时表(例如,在从应用程序调用的 proc 中),这将是错误的。
      • 被否决为:验证接受的答案不会从通过不同连接创建的#temp 表返回数据。这个方法可以。接受的答案更安全。
      【解决方案5】:

      你也可以通过以下方式做到这一点..

      create table #test (a int, b char(1))
      
      select * From #test
      
      exec tempdb..sp_columns '#test'
      

      【讨论】:

      • 提供编写显式 CREATE TABLE: exec tempdb..sp_columns '#test' 所需的一切
      【解决方案6】:

      安东尼

      试试下面的。它会给你预期的输出

      select c.name as Fields from 
      tempdb.sys.columns c
          inner join tempdb.sys.tables t
       ON c.object_id = t.object_id
      where t.name like '#MyTempTable%'
      

      【讨论】:

        【解决方案7】:
        select * 
        from tempdb.INFORMATION_SCHEMA.COLUMNS 
        where TABLE_NAME=OBJECT_NAME(OBJECT_ID('#table'))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多