Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

temporäre tabellen dynamisch erstellen

609 views
Skip to first unread message

reto

unread,
Dec 16, 2002, 10:20:52 AM12/16/02
to
hallo zusammen

ich möchte eine temporäre tabelle explizit erstellen,
und zwar dynamisch deren aufbau aus einem sql-select kommt.

klingt etwas kompliziert darum hier mal ein bespiel.

select-statement das den aufbau der temporären tabelle gibt:

select * from TABLE-ELEMENTS >> resultat ist:

ID SPALTENNAME DATENTYP NULLWERT DEFAULT
-- ----------- ----------- -------- -------
1 tmp_id int NOT NULL
2 tmp_desc varchar(50) NOT NULL ''
3 tmp_active bit NOT NULL 0
4 tmp_date datetime NULL getdate()


nun soll damit die temporäte table #TEMPRESULT dynamisch erstellt
werden und zwar explizit. von "hand" also nicht dynamisch wäre das
etwa so:

CREATE TABLE #TEMPRESULT
(
tmp_id int NOT NULL,
tmp_desc varchar(50) NOT NULL DEFAULT (''),
tmp_active bit NOT NULL DEFAULT (0),
tmp_datwe datetime DEFAULT (getdate())
)


ist das mit einer stored-procedure machbar?

ich bin für alle tipps sehr dankbar.

viele grüsse
reto

Michael Hitzler

unread,
Dec 16, 2002, 10:37:33 AM12/16/02
to

"reto" <jol...@bluemail.ch> schrieb im Newsbeitrag
news:ae987414.02121...@posting.google.com...

Hallo. Probier mal:

SET NOCOUNT ON
SELECT FELD1 ,FELD2 INTO #temptabelle FROM deineTabelle
SELECT * from #temptabelle
DROP TABLE #temptabelle


Gruß

Michael

reto

unread,
Dec 16, 2002, 3:28:06 PM12/16/02
to
"Michael Hitzler" <michael...@shp-frankfurt.de> wrote in message news:<u8q26iRpCHA.1876@TK2MSFTNGP10>...

hallo

wenn ich die antwort von michael richtig interpretiere bekomme ich so
das gesamte resultset im prinzip als 1:1 kopie in die temporäre
tabelle.

was ich aber möchte ist, eine neue temporäre tabelle erzeugen die leer
ist, und die so aufgebaut ist wie das ergebnis der select anfrage. die
spaltennamen, datentypen, null/not null, standardwerte werden also
dynamisch aus dem resultset gelesen und damit die temporäre tabelle
explizit erzeugt.
siehe dazu auch die beispiele oben.

besten dank für die weiteren inputs,
reto

Christa Kurschat

unread,
Dec 17, 2002, 2:41:08 AM12/17/02
to
Hallo Reto,

reto <jol...@bluemail.ch> schrieb:

wenn ich das jetzt richtig verstanden habe, hast Du in einer Tabelle
die Beschreibung der temp. Tabelle stehen?

Dann mußt Du mit einem Cursor durch die Tabelle laufen und den
String dynamisch generieren (ungetestet):
declare @sqlcreate varchar(4000)

set @sqlcreate = 'create table #tempresult ( '
declare mycursor for select Spaltenname, Datentyp, nullwert, default
from TableElements
open mycursor

fetch next from mycursor into @Spalte, @Typ, @null, @default
while @@fetch_status = 0
begin
set @sqlcreate = sqlcreate + @spalte + ' ' + @typ + ' ' + @null + '
' + @default + ', '
fetch next from mycursor into @Spalte, @Typ, @null, @default
end
set @sqlcreate = left(@sqlcreate , len(@sqlcreate) -1)
set @sqlcreate = @sqlcreate + ')'
print @sqlcreate
exec (@sqlcreate)

Mit Print den String kontrollieren, wenn er korrekt ist, kannst Du
ihn mit exec ausführen.

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
KnowHow.mdb: http://www.freeaccess.de
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm


Christoph Muthmann

unread,
Dec 17, 2002, 2:40:16 AM12/17/02
to
reto wrote:
> "Michael Hitzler" <michael...@shp-frankfurt.de> wrote
>> "reto" <jol...@bluemail.ch> schrieb

>>> hallo zusammen
>>>
>>> ich möchte eine temporäre tabelle explizit erstellen,
>>> und zwar dynamisch deren aufbau aus einem sql-select kommt.
>>>
>>> [und noch einiges mehr dazu]
>>> reto
>>
>> [einiges zum Erzeugen einer Tabelle mit Select into]
>> Michael
>
> [sehr richtiges zur Interpretation von Michaels Vorschlag]

>
> was ich aber möchte ist, eine neue temporäre tabelle erzeugen die leer
> ist, und die so aufgebaut ist wie das ergebnis der select anfrage. die
> spaltennamen, datentypen, null/not null, standardwerte werden also
> dynamisch aus dem resultset gelesen und damit die temporäre tabelle
> explizit erzeugt.
> siehe dazu auch die beispiele oben.
>
> besten dank für die weiteren inputs,
> reto

Hallo Reto,
wenn Du dynamisch arbeiten willst, dann mußt Du Dir Dein Statement in einem
Varchar aufbereiten und per EXEC ausführen.

declare @mycommand varchar(1000)
Set @Mycommand = 'Create Table t (f1 int)'
Exec(@Mycommand)
Select * from t
drop table t

Problematischer wird es mit einer echten temporären Tabelle, da das EXEC
einen eigenen Batch darstellt und die temporäre Tabelle dann nicht für den
äußeren Batch sichtbar ist.

Einen schönen Tag noch,
Christoph
--
(Please post ALL replies to the newsgroup only unless indicated otherwise)

SQL-Server-FAQ: http://www.berndjungbluth.de


Christa Kurschat

unread,
Dec 17, 2002, 4:02:00 AM12/17/02
to
Hallo Reto,

ich nochmal.

Christa Kurschat <christa_...@web.de> schrieb:

> Hallo Reto,
>
> reto <jol...@bluemail.ch> schrieb:
>

[...]

Christoph's Einwand ist berechtigt, ich habe da jetzt nicht so dran
gedacht.
Du müßtest globale (##) temp. oder physische Tabellen verwenden,
wenn Du die Geschichte dynamisch verwalten willst.

0 new messages