Certaines données de l'échantillon:SQL: Comment limiter le nombre d'enregistrements l'instruction MERGE insérera
DECLARE @TARGET TABLE (ID INT, value INT) ;
DECLARE @SOURCE TABLE (ID INT, value INT)
INSERT INTO @TARGET VALUES (1, 213)
INSERT INTO @TARGET VALUES (2, 3)
INSERT INTO @TARGET VALUES (3, 310)
INSERT INTO @TARGET VALUES (4, 43)
INSERT INTO @SOURCE VALUES (1, 134)
INSERT INTO @SOURCE VALUES (2, 34)
INSERT INTO @SOURCE VALUES (13, 310)
INSERT INTO @SOURCE VALUES (14, 43)
INSERT INTO @SOURCE VALUES (15,32)
INSERT INTO @SOURCE VALUES (16, 30)
INSERT INTO @SOURCE VALUES (17, 60)
INSERT INTO @SOURCE VALUES (18, 5)
MERGE @TARGET t USING (SELECT * FROM @SOURCE) AS s ON (t.id = s.id)
WHEN NOT MATCHED THEN
INSERT VALUES (s.id,s.value);
SELECT * FROM @TARGET
Je vais avoir une table cible, et une table source. Ce que je veux accomplir est que quand il y a un grand nombre de not matched
articles, pour insérer seulement les articles du haut x avec la valeur la plus élevée.
En utilisant la fusion supérieure sur elle-même ne fonctionnera pas, car cela limiterait l'ensemble table source, je veux faire quelque chose comme
WHEN NOT MATCHED
LIMIT(5) AND ORDER BY Value DESC --only insert the 5 non-matches with the highest value
INSERT VALUES (s.id,s.value)
---- ---- ACTUALISATION
Mon instruction MERGE aussi contient une THEN, égalés:
WHEN MATCHED THEN
UPDATE SET t.value = s.value
cette nie malheureusement les réponses données par Ian et Dog ...
vous avez raison sur le SET ROWCOUNT étant obsolète. Dans mon commentaire à Ian Quigley, j'ai écrit que mon exemple est trop simplifié, et a omis le fait que j'ai aussi une instruction WHEN MATCHED THEN qui met à jour la cible. La mise à jour doit se produire sur tous les enregistrements correspondants, l'insertion doit uniquement ... – Gidon
... se produire sur les x premiers enregistrements avec la valeur la plus élevée. Votre exemple fonctionnerait si je n'avais pas l'autre exigence. – Gidon
Que faire en deux étapes voir la réponse modifiée. –