[MSSQL]if exists drop temporary table

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

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Ik ben bezig met een script in php dat gebruikers uit een tabel de tabel leest. Nu is de lijst met gebruikers erg groot en wil ik dus pagina's maken. Ik had hiervoor een andere topic over hoe ik dat kon doen.

Dit is nu gelukt. Ik gebruik een "temporary table" waarin ik de waarden zet die voldoen aan de where clausule. Als nu gebruiker nu de volgende pagina wil zien wil ik dat de gegevens uit de temporary table worden gelezen. En niet eerst een select statement om de temporary table te vullen want dat is eigenlijk al gebeurt.

Nu onstaat er een probleem: Als de gebruiker een nieuwe where clausuele instelt (zoek functie) dan moet de temporary table opnieuw gevuld worden. Om dit voorelkaar te krijgen moet de eerste temporary table verwijderd worden omdat er geen tabellen met dezelfde naam kunnen bestaan.

Dat verwijderen gaat gewoon zo:
code:
1
DROP TABLE #Temp

Maar ik wil dus pas verwijderen als er een nieuwe select moet worden uitgevoerd. dus aan het begin en niet aan het einde van de query.

Dus op het moment dat de gebruiker voor het eerst de lijst bekijkt bestaat de temporary table #Temp nog niet want die is nog niet aangemaakt.

Dus ik moet kijken of de tabel bestaat. Zo ja, Droppen en dan opnieuw aanmaken en vullen. Zo nee, alleen vullen.

Ik dacht dat checken of hij bestaat doe ik zo
code:
1
2
3
4
5
if exists (select * from #Temp)
begin
select * from #Temp;
DROP TABLE #Temp;
end

Dit werkt alleen als de tabel bestaat. als hij niet bestaat (de eerste keer dus) krijg ik een error. |:(

Ik snap het niet. In MySQL is het gewoon DROP TABLE #Temp if exists maar hoe werkt dat in MSSQL 8)7

Jochemmol


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
De temporary table wordt automatisch gedropt als hij uit scope gaat. Ik denk dus niet dat het gaat werken wat jij wilt.

Als de connectie verbroken wordt is de temptable er niet meer.

Je kunt gewoon een normale table maken, met een GUID erin. Je genereert een nieuwe Guid, en insert alle gegevens incl de GUID in de tabel. Je retourneert de GUID naar de client en gebruikt deze guid om de volgende pagina op te halen. Je gebruikt dus de GUID om de goede gegevens uit de tabel naar de juiste client te retourneren.

Periodiek moet je de tabel opschonen op basis van bijvoorbeeld een timestamp.

[ Voor 53% gewijzigd door P_de_B op 14-07-2005 10:45 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Maar dat is geen probleem want als hij niet bestaat moet de "temporary table" opnieuw aangemaakt worden. en verder niks hoeft er niks te gebeuren.

En anders moet hij gedropt worden.

Maar dat uitzoeken bij de MSSQL server de #Temp tabel bestaat geeft errors.

En als ik 80000 regels heb en ik moet die inserten in een tabel. dan duurt het inserten langer als ik het doe in een "temporary table" athans ik heb het gemeten in de Query analyser.

[ Voor 57% gewijzigd door Jochemmol op 14-07-2005 10:53 ]

Jochemmol


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Als jij hem in de connectie nog niet gemaakt hebt, bestaat hij niet. Simpel :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21:23

pistole

Frutter

code:
1
2
3
4
5
if exists (select name from systables where name='#Temp')
begin
select * from #Temp;
DROP TABLE #Temp;
end


en ^^

Ik frut, dus ik epibreer


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
pistole schreef op donderdag 14 juli 2005 @ 10:49:
code:
1
2
3
4
5
if exists (select name from systables where name='#Temp')
begin
select * from #Temp;
DROP TABLE #Temp;
end


en ^^
Nope, een #temp table wordt in de tempdb gemaakt, en heeft niet als naam #tempnaam, maar #tempnaam____________________________________239482395850945

waarbij dat nummer uniek is voor de connectie.

Tenslotte zou het sysbojects moeten zijn, en niet systables.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
dat die in de sysobjects niet bestaat ontdekte ik ook. Dus moest ik iets anders bedenken.

Maar is het helemaal niet mogelijk in MSSQL om te checken of een "temporary table" bestaat. In MySQL is dat heel gemakkelijk.

[ Voor 13% gewijzigd door Jochemmol op 14-07-2005 11:00 ]

Jochemmol


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Dat _hoef_ je niet te controleren. Als je hem nog niet hebt gemaakt bestaat 'ie niet. Dat lijkt een onzin antwoord, maar denk er maar eens over na :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 21:36
Maak een een #temp aan in Query analyzer, en druk op CTRL-N.
Probeer nu in dat nieuwe venster (en nieuwe connectie) maar de inhoud te lezen van #Temp.

Sterkte...

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Je heb gelijk Stom van mij. de tabel bestaat steeds niet meer.

Ik heb het al opgelost.

bedankt voor jullie hulp

Jochemmol


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Wat ik me nu wel afvraag, hoe gaat MySQL dan met temp tables om? Die blijven bestaan tot je ze dropt??

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 06:52
P_de_B schreef op donderdag 14 juli 2005 @ 11:21:
Wat ik me nu wel afvraag, hoe gaat MySQL dan met temp tables om? Die blijven bestaan tot je ze dropt??
Volgens mij worden ze automatisch gedropt zodra ze out of scope zijn. Zit nu niet meer achter m'n .NET/MSSQL machine dus kan er niets over opzoeken helaas. Kijk anders even in de books online...

[ Voor 20% gewijzigd door sig69 op 14-07-2005 12:11 ]

Roomba E5 te koop


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

sig69 schreef op donderdag 14 juli 2005 @ 12:09:
[...]

Volgens mij worden ze automatisch gedropt zodra ze out of scope zijn. Zit nu niet meer achter m'n .NET/MSSQL machine dus kan er niets over opzoeken helaas. Kijk anders even in de books online...
Ik denk dat P_de_B wel weet hoe mssql omgaat met temp tables ;)
Hij vroeg zich af hoe mysql dat doet.

Today's subliminal thought is:


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 06:52
Oeps.. overheen gelezen...

Roomba E5 te koop


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 30-04 11:04
Jochemmol schreef op donderdag 14 juli 2005 @ 11:16:
Je heb gelijk Stom van mij. de tabel bestaat steeds niet meer.

Ik heb het al opgelost.

bedankt voor jullie hulp
offtopic:
:w Jochem!

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 05-05 18:54

TeeDee

CQB 241

Even (ik weet dat het e.e.a. al opgelost is) een andere insteek.
De TS heeft het hier als ik het goed begrijp over een "Paging Recordset"?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

P_de_B schreef op donderdag 14 juli 2005 @ 11:21:
Wat ik me nu wel afvraag, hoe gaat MySQL dan met temp tables om? Die blijven bestaan tot je ze dropt??
MySQL dropt ze gewoon als je de connectie sluit, zoals in de spec ook vermeld staat. (een van de dingen die ze redelijk volgens de specs doen ;) )
Daarnaast kent MySQL de mogelijkheid om het drop-tablestatement, wat ook in MSSQL gewoon toepasbaar zal zijn voor temp. tables, uit te breiden met het 'if exists'-statement om te voorkomen dat je een foutmelding krijgt na een drop.

Als je zoiets in MSSQL wilt simuleren moet je waarschijnlijk in je information_schema gaan graven en als er een positief resultaat uit een query volgt, waarna je hem dropt en anders gewoon niks doet. Dat kan met een stored procedure oid vast wel geregeld worden.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
ACM schreef op donderdag 14 juli 2005 @ 14:28:
[...]

MySQL dropt ze gewoon als je de connectie sluit, zoals in de spec ook vermeld staat. (een van de dingen die ze redelijk volgens de specs doen ;) )
Dat dacht ik al, maar dan snap ik de vraag niet echt icm met paging.
Als je zoiets in MSSQL wilt simuleren moet je waarschijnlijk in je information_schema gaan graven en als er een positief resultaat uit een query volgt, waarna je hem dropt en anders gewoon niks doet. Dat kan met een stored procedure oid vast wel geregeld worden.
Je zou kunnen selecten uit de tempdb..sysobjects table, maar een #temp tabel krijgt een suffix. Voor zover ik weet is dit een random getal, en kun je dus niet bepalen welke #temp table van "jouw" connectie is.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Ik heb even geen mssql voorhanden om het te checken, maar afaik werkt het volgende gewoon:
SQL:
1
IF OBJECT_ID('tempdb..#bla') -- etc.

Today's subliminal thought is:


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Annie heeft gelijk :)

Net getest en het werkt.

.

[ Voor 92% gewijzigd door P_de_B op 14-07-2005 17:00 ]

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1