So rufen Sie Feldnamen aus einer temporären Tabelle ab (SQL Server 2008)

73

Ich verwende SQL Server 2008. Angenommen, ich erstelle eine temporäre Tabelle wie diese:

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

Wie kann ich die Liste der Felder dynamisch abrufen? Ich würde gerne so etwas sehen:

Fields:
col1
col2

Ich habe darüber nachgedacht, sys.columns abzufragen, aber es scheint keine Informationen über temporäre Tabellen zu speichern. Irgendwelche Ideen?

Anthony
quelle

Antworten:

136
select * from tempdb.sys.columns where object_id =
object_id('tempdb..#mytemptable');
kristof
quelle
Gute ans. Verwenden select name from tempdb.sys.tablesSie alle temporären Tabellennamen
abrufen
3
Es wurde überprüft, dass diese Methode keine Daten aus # temp-Tabellen zurückgibt, die über eine andere Verbindung erstellt wurden. Die Alternativen mit LIKE # temp% tun dies.
Morvael
30
select * 
from tempdb.INFORMATION_SCHEMA.COLUMNS
where table_name like '#MyTempTable%'
Ed Guiness
quelle
4
Diese Antwort ist besser. Der Tabellenname ist ebenso enthalten wie der Datentyp für die Spalte. Wenn Ihre where-Klausel eine Liste von temporären Tabellen enthält, ist dies sogar noch besser, da Sie unterscheiden können, welche Spalten von welcher temporären Tabelle stammen
VISQL
1
@VISQL Eigentlich ist die akzeptierte Antwort besser, weil sie nicht verwendet wird INFORMATION_SCHEMA. Sie können die Datentypen einfach durch Verbinden mit sys.typesund Sie können die Tabellennamen einfach über OBJECT_NAME( object_id , database_id )oder Verbinden mit abrufen tempdb.sys.tables. Dies ist alles, was die INFORMATION_SCHEMAAnsichten tun.
Solomon Rutzky
1
Das Problem dabei ist, dass wenn Sie 2 temporäre Tabellen mit ähnlichen Namen verwenden (z. B. # TEMP1 und # TEMP12), wenn Sie # TEMP1 als Tabellennamen verwenden, Sie auch die Spalten für # TEMP12 erhalten
apc
Die Verwendung von '#MyTempTable [ ] [ ] [_]%' funktioniert besser, um sicherzustellen, dass Sie keine anderen Tabellen erhalten, die mit dem Namen der gesuchten Tabelle beginnen
apc
2
Downvoted als: Verifiziert, dass die akzeptierte Antwort keine Daten aus # temp-Tabellen zurückgibt, die über eine andere Verbindung erstellt wurden. Diese Methode funktioniert. Die akzeptierte Antwort ist viel sicherer.
Morvael
8

So verwenden Sie information_schema und kollidieren nicht mit anderen Sitzungen:

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

Die temporären Tabellen sind in "tempdb" definiert und die Tabellennamen sind "entstellt".

Diese Abfrage sollte den Trick machen:

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

Marc

marc_s
quelle
2
Ich denke, das könnte den Rahmen überschreiten. Wenn es ein Zeitcode ist, gut. Wenn es Code ist, der eine echte Lebensdauer hat, Problem.
JCollum
1
Ja, schlechte Lösung - Wenn mehrere Verbindungen temporäre Tabellen mit demselben Namen erstellt haben (z. B. in einem Prozess, der von einer Anwendung aufgerufen wird), ist dies falsch.
Tao
Downvoted als: Verifiziert, dass die akzeptierte Antwort keine Daten aus # temp-Tabellen zurückgibt, die über eine andere Verbindung erstellt wurden. Diese Methode funktioniert. Die akzeptierte Antwort ist viel sicherer.
Morvael
3

Sie können es auch auf folgende Weise tun ..

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

select * From #test

exec tempdb..sp_columns '#test'
Nishad
quelle
bietet alles, was zum Schreiben des expliziten benötigt wird CREATE TABLE: exec tempdb..sp_columns '#test'
yzorg
1

Anthony

Versuchen Sie es mit dem folgenden. es wird Ihre erwartete Ausgabe geben

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%'
Franklin
quelle
0
select * 
from tempdb.INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME=OBJECT_NAME(OBJECT_ID('#table'))
elle0087
quelle