[SQL] gebruik temporary table

Pagina: 1
Acties:
  • 138 views sinds 30-01-2008
  • Reageer

  • El_BingO
  • Registratie: Juli 2001
  • Laatst online: 26-08 12:01
Ik gooi in een stored procedure een waarde naar een temporary table (in een while) en dan retourneer ik aan het einde de gegevens van de temp_table. Ik gebruik MS-SQL 2000.

Wat gebeurt er als ik die stored procedure 2x tegelijk aanroep, of erger nog 10 of 100 keer tegelijk? Maakt SQL-server dan net zoveel temp_tables aan als nodig is?
Of kan ie er dan maar 1 tegelijk afhandelen?
Of komen de waardes van de verschillende aanroepen van de stored procedure in dezelfde tabel?

En wat is de beste methode om een temporary table in een stored procedure aan te maken?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Ik weet niet hoe het zit in SQL Server, maar ik geloof dat Informix iedere keer een nieuwe temp. table aanmaakt. Dit zal in SQL Server wel hetzelfde zijn vermoed ik.

https://fgheysels.github.io/


  • El_BingO
  • Registratie: Juli 2001
  • Laatst online: 26-08 12:01
whoami schreef op 14 augustus 2002 @ 10:34:
Ik weet niet hoe het zit in SQL Server, maar ik geloof dat Informix iedere keer een nieuwe temp. table aanmaakt. Dit zal in SQL Server wel hetzelfde zijn vermoed ik.
Ok, maar als ik boven in de stored procedure
Create table #t (EmpID char(6), RecID int identity(1,1))
doe, en onder aan Drop table #t
Dan zegt ie bij create dat #t al bestaat, en als ik hem handmatig via een sql statement wil droppen, dan kan ie hem niet vinden...

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 14-07 14:28

thomaske

» » » » » »

is er geen standaard functie in mssql om een temp-table te maken. Bij postgres is dat namelijk wel het geval, en dan maaktie een mooie unieke naam! :)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Verwijderd

Zoals in de documentatie staat bij temp tables, maakt sqlserver voor iedere connection een nieuwe aan, of binnen elke scope delimiter, bv binnen een stored proc. Hij houdt ze uit elkaar door een nummertje.

Dus in je stored proc doe je bv:
code:
1
2
3
4
5
6
CREATE TABLE #mytemptable
(
-- fields def
)

INSERT INTO #mytemptable SELECT * FROM foo

Voor elke call naar deze stored proc is er maar 1 temp table, #mytemptable. Maar als deze stored proc bv 10 keer is aangeroepen tegelijkertijd, zijn er 10 #mytemptables, #mytemptable1 tm #mytemptable10. Daar heb je geen last van, dat regelt SQLServer.

nadat de stored proc out of scope gaat, wordt de temptable opgeruimd. Wil je een application wide temp table, gebruik dan 2 '#', dus ##mytemptable.

Hoe je die temptable creeert, boeit niet zo. Gebruik je SQLServer 2000, gebruik dan waar mogelijk het type 'table', ipv een temptable, want een temptable is fysiek op disk aanwezig, een 'table' type alleen in core.

Verwijderd

El_BingO schreef op 14 augustus 2002 @ 10:44:
[...]
Ok, maar als ik boven in de stored procedure
Create table #t (EmpID char(6), RecID int identity(1,1))
doe, en onder aan Drop table #t
Dan zegt ie bij create dat #t al bestaat, en als ik hem handmatig via een sql statement wil droppen, dan kan ie hem niet vinden...
Droppen hoeft niet, dat gebeurt automatisch.

In een stored proc of in query analyser testen? Want dat maakt wel degelijk uit! als je de code van een stored proc copy/paste in een query analyser window en 1 keer runt zonder een drop, en je runt hem weer roept ie: 'temp table already exists'. Logisch, want per CONNECTIE maakt hij een temptable aan, maak je er dus meerdere met dezelfde naam zonder te droppen, dan is die temptable er nog steeds.

Maak je 1 temp table aan in een stored proc, dan wordt deze automatisch gedropped aan het eind van de stored proc.

Maar nogmaals: kijk wat je kunt doen met bv het type 'Table', en ook met bv views. Temp tables lijken makkelijk, maar probeer ze te vermijden, ze kunnen je performance danig in doen laten zakken bij veel users.

  • El_BingO
  • Registratie: Juli 2001
  • Laatst online: 26-08 12:01
Ok thanx allemaal, het is gelukt. Ik heb de drop er toch ingezet, voor de zekerheid ;)
Ik moet toch een temp_table gebruiken want ik wil de webserver niet belasten met een rekensom, maar de SQL server juist wat meer. Die geeft namelijk geen krimp.
Boven dien is het maar een lijstje van max ca. 15 rijen en 2 kolommen. Dat gaat toch geen deuk in een pakje boter schoppen denk ik...

Nogmaals bedankt. Heb je nog tips? Dan mag dat altijd ;)
Pagina: 1