7
votes

Comment puis-je utiliser du curseur pour supprimer l'enregistrement de la table

Je veux utiliser du curseur pour supprimer l'enregistrement de la table. Comment puis-je le faire?

J'utilise MSSQL 2008 Express Ce code ne supprime rien de #Temp. J'ai aussi essayé d'où le courant du cursor_name n'a pas fonctionné.

Voici mon code d'exemple: xxx

merci d'avance


5 commentaires

Pour l'amour de tout ce qui est saint, pourquoi utilisez-vous un curseur pour le faire au lieu d'une simple requête Supprimer? Avez-vous une rancune contre votre DBA?


Question idiote mais avez-vous un employé de 10 ans dans la table des employés ?? Aussi pourquoi voulez-vous faire un curseur pour cela? C'est une méthode très inefficace. Assurez-vous également qu'il n'y a pas de déclencheurs qui abandonnent votre suppression.


@Johnfx non je suis juste curieux de le faire, juste pour apprendre, dans la pratique, je utilise aussi des déclarations de suppression simples


@Johnfx peut-être qu'il veut juste s'assurer de créer autant de contention que possible: d un curseur sur TEMPDB semble un bon moyen. J / K Vivek Kinda.


@Vivek - Ne pratiquez pas le mal. Vous pourriez être bon à cela.


3 Réponses :


0
votes

Pourriez-vous s'il vous plaît essayer de ci-dessous, merci pour votre temps.

Vous avez récupéré les données du curseur, mais vous n'avez pas appuyé dans vos variables manquées dans pendant boucle, s'il vous plaît jeter un oeil sur Sous le code, merci. xxx

update: J'ai des changements dans l'instruction 2ND FETCH , vous avez simplement ajouté ci-dessous la partie en surbrillance, merci

récupération en regard de Employee_cursor dans @eid, @nid ;


5 commentaires

Comment c'est différent de mon seul? , eh bien j'ai essayé mais je n'ai pas travaillé, de toute façon merci pour vous intéout


Désolé, pour une réponse tardive, cependant, je vais changer ma réponse, s'il vous plaît jeter un coup d'œil dessus, merci


Lorsque le code a l'air si similaire à l'original, il est généralement utile de mettre en évidence ce qui a été changé (je suppose qu'il ajoute le dans sur le second extraire , car c'est ce que j'étais sur le point de répondre)


Eh bien, j'ai une réponse mais je ne peux pas le poster


@Elias Hossain Oui ça marche mais pourquoi deux tables, je pense que cela peut être fait avec celui que je viens de poster une manière, vérifiez cela aussi, merci d'avoir pris intérêt



7
votes
use AdventureWorks

select * into #temp from HumanResources.Employee;

declare @eid as int;
declare @nid as varchar(15);

DECLARE Employee_Cursor CURSOR FOR
SELECT A.EmployeeID, A.NationalIDNumber FROM #temp AS A
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
WHILE @@FETCH_STATUS = 0
   BEGIN
      IF (@eid > 10)
      BEGIN
        delete from #temp where current of Employee_Cursor
      END
      FETCH NEXT FROM Employee_Cursor INTO @eid , @nid ;
   END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;

select * from #temp

drop table #temp
this works for me

0 commentaires

6
votes

Il y a une réponse beaucoup plus simple - utilisez cette commande: xxx

Ça s'appelle "Positionné Supprimer" et décrit à msdn .


0 commentaires