如何从临时表中检索字段名称(SQL Server 2008)


73

我正在使用SQL Server2008。假设我创建了一个像这样的临时表:

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

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

Fields:
col1
col2

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

Answers:


136
select * from tempdb.sys.columns where object_id =
object_id('tempdb..#mytemptable');

很好 使用select name from tempdb.sys.tables获取所有临时表名称
Raaghav

3
验证此方法不会从通过其他连接创建的#temp表中返回数据。使用LIKE#temp%的替代方法可以。
Morvael

30
select * 
from tempdb.INFORMATION_SCHEMA.COLUMNS
where table_name like '#MyTempTable%'

4
这个答案更好。表名以及列的数据类型都包括在内。如果您的where子句包含一个临时表列表,那么它会更加优越,因为您可以区分哪些列来自哪个临时表
VISQL 2012年

1
@VISQL实际上,可接受的答案更好,因为它不使用INFORMATION_SCHEMA。您可以通过JOINing轻松获得数据类型sys.types,也可以通过OBJECT_NAME( object_id , database_id )或JOINing to轻松获取表名称tempdb.sys.tables。这就是INFORMATION_SCHEMA视图所要做的。
所罗门·鲁茨基

1
这里的问题是,如果你使用的是2代临时表具有类似名称(如#TEMP1和#TEMP12)然后使用#TEMP1作为表名时,您还可以获得列#TEMP12
APC

使用'#MyTempTable [ ] [ ] [_]%'可以更好地确保您不会找到以要查找的表名开头的其他表
apc

2
降低为:验证接受的答案没有返回通过其他连接创建的#temp表中的数据。此方法可以。公认的答案更安全。
Morvael

8

要使用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'))

7

临时表是在“ 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%'

马克


2
我认为这可能会跨越范围。如果是一次性代码,那很好。如果是真正有效的代码,那就麻烦了。
jcollum

1
是的,不好的解决方案-如果多个连接创建了具有相同名称的临时表(例如,在从应用程序调用的proc中),这将是错误的。

降低为:验证接受的答案没有返回通过其他连接创建的#temp表中的数据。此方法可以。公认的答案更安全。
Morvael

3

您也可以按照以下方式来做..

create table #test (a int, b char(1))

select * From #test

exec tempdb..sp_columns '#test'

提供了编写显式内容所需的所有内容CREATE TABLEexec tempdb..sp_columns '#test'
yzorg 2015年

1

安东尼

尝试以下之一。它会给我们预期的输出

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%'

0
select * 
from tempdb.INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME=OBJECT_NAME(OBJECT_ID('#table'))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.