Première question postée, je m'excuse par avance pour les éventuelles maladresses. La table contient des enregistrements qui sont affectés à une équipe, les affectations initiales sont effectuées avec un autre processus. Il arrive fréquemment que nous devions réaffecter les enregistrements d'un agent et les répartir équitablement entre les autres membres de l'équipe. Nous le faisions à la main, un par un, ce qui était fastidieux. J'ai donc trouvé cette solution :
DECLARE @UpdtAgt TABLE (ID INT, Name varchar(25))
INSERT INTO @UpdtAgt
VALUES (1, 'Gandalf')
,(2,'Hank')
,(3,'Icarus')
CREATE TABLE #UpdtQry (TblID varchar(25))
INSERT INTO #UpdtQry
SELECT ShtID
FROM TestUpdate
DECLARE @RowID INT
DECLARE @AgtID INT
DECLARE @Agt varchar(25)
DECLARE @MaxID INT
SET @MaxID = (SELECT COUNT(*) FROM @UpdtAgt)
SET @AgtID = 1
--WHILE ((SELECT COUNT(*) FROM #UpdtQry) > 0)
WHILE EXISTS (SELECT TblID FROM #UpdtQry)
BEGIN
SET @RowID = (SELECT TOP 1 TblID FROM #UpdtQry)
SET @Agt = (SELECT Name FROM @UpdtAgt WHERE ID = @AgtID)
UPDATE TestUpdate
SET Assignment = @Agt
WHERE ShtID = @RowID
DELETE #UpdtQry WHERE TblID = @RowID
IF @AgtID < @MaxID
SET @AgtID = @AgtID + 1
ELSE
SET @AgtID = 1
END
DROP TABLE #UpdtQry
C'est vraiment ma première tentative de faire quelque chose d'aussi approfondi. Une mise à jour de 100 lignes prend environ 30 secondes. La table UPDATE, TestUpdate, ne possède que l'index CLUSTERED. Comment puis-je rendre cette opération plus efficace ?
EDIT : Je n'ai pas très bien défini les tables @UpdtAgt et #UpdtQry dans mon explication. @UpdtAgt contiendra les agents à qui sont réassignés les enregistrements, et changera probablement à chaque fois que cela sera utilisé. La table #UpdtQry contiendra une clause WHERE pour définir les agents dont les enregistrements seront réaffectés, et là encore, elle changera à chaque utilisation. J'espère que cela rend les choses un peu plus claires. Encore une fois, je m'excuse de ne pas avoir bien compris du premier coup.
EDIT 2 : J'ai commenté l'ancienne clause WHILE et inséré celle que HABO a suggérée. Merci encore à HABO.