Toon posts:

[SQL Server] ignoren van error bij insert via t-sql

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een stored procedure die gebruik maakt van een dynamische cursor gebaseerd op een tijdelijke table, om elke keer de children van een record toe te voegen aan diezelfde tijdelijke tabel.

Doordat er geen index op de temp tabel is, worden die records onderaan toe gevoegd en gaat de cursor net zolang door totdat er niets meer aan de tabel toegevoegd is en de fetch next dus geen nieuwe fetch heeft gekregen.

Nu is het theoretisch mogelijk dat twee records naar elkaar verwijzen. Dit wil ik natuurlijk wel even beveiligen. Ik kan een unique op de temp tabel gooien, maar dan zal ik een error krijgen als die een dubbel record vind, terwijl hij 'm van mij mag negeren.

Andere mogelijkheid is om de output van de insert in een tweede temp tabel te probben en een voor een van die records te kijken of het al bestaat, zo ja negeren en zo nee inserten, maar dat zal een redelijke overhead geven.

Als ik via de enterprise manager records copy-paste en er wordt een error opgegooid, dan wordt het record ook niet geinsert.

Mijn vraag is dus, kan ik dat (of iets soortgelijks) ook bouwen in t-sql?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Waarom gebruik je een cursor om die records te inserten ? Dat gaat toch gewoon supertraag?
Je kan ook dit doen:
code:
1
2
INSERT INTO tabel ( veld, veld)
SELECT column, column FROM othertabel


Als je enkel de unique records wilt hebben, dan kan je die er wellicht al uitfilteren in de SELECT.

Trouwens, een gewone index bepaald de fysieke opslagvolgorde van je records niet; enkel een clustered index doet dat.

Als je het toch niet zo kunt doen, dan kan je de @@ERROR variable checken of er een error gebeurd is of niet.

[ Voor 12% gewijzigd door whoami op 29-06-2004 14:24 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
mijn records komen niet uit 1 tabel, maar uit n tabellen. De child records kunnen dus ook in 1 van die n tabellen staan.
Mijn sp roept binnen de cursor een andere sp aan

code:
1
2
insert into #content
exec gpr__ALL_SelectContent @cursorGUID, @pType


waarbij de @cursorGUID bij elke fetch veranderd en het type is een parameter van de initiele sp


edit:
de @@error checken zal niet echt lekker werken. Ik wil nl dat 1 van die records dan genegeerd wordt en niet alle records die na het record van de error (plus het error record)

en index vs. clustered index. bedankt voor de info

[ Voor 26% gewijzigd door Verwijderd op 29-06-2004 14:35 ]