2011-02-05 4 views
1

J'essaie de mettre à jour une table SQL avec x quantité de lignes à partir d'une requête ordonnée, où x est le solde de 100000 - un résultat précédent. J'utilise ROWCOUNT pour limiter le nombre de résultats dû au fait que x est un paramètre mais je ne pense pas que cela fonctionne.SQL Server 2000 Mise à jour basée sur imbriqué SELECT avec TOP

Quelqu'un peut-il suggérer un correctif ou une alternative sans curseurs?

DECLARE @Top int 
SET @Top = 100000 - @CountRecords 

SET ROWCOUNT @Top 

UPDATE 
    UpdateTable 
SET 
    UpdateField = 'SomeValue' 
WHERE 
    Id IN 
    (
     SELECT 
      TOP 100% Id 
     FROM 
      SelectTable 
     WHERE 
      (SelectField1 IS NULL) AND 
        (SelectFieldDate IS NOT NULL) 
      ORDER BY 
        SelectFieldDate       
    ) 

SET ROWCOUNT 0 

Répondre

2

SET ROWCOUNT applique aux résultats intermédiaires trop peut donc induire en erreur

Si vous chargez une table temporaire, vous pouvez contourner cela en séparant la mise à jour en deux étapes

DECLARE @Top int 
SET @Top = 100000 - @CountRecords 

SET ROWCOUNT @Top 

SELECT Id 
INTO #foo 
FROM 
    SelectTable 
WHERE 
    (SelectField1 IS NULL) AND 
      (SelectFieldDate IS NOT NULL) 
ORDER BY 
    SelectFieldDate     

SET ROWCOUNT 0 

UPDATE 
    UpdateTable 
SET 
    UpdateField = 'SomeValue' 
WHERE 
    Id IN 
    (
     SELECT id FROM #foo 
    ) 
+0

Merci GBN, j'avais commencé à regarder une variable de table, mais je pensais que je pouvais faire le travail ci-dessus. Votre solution est parfaite. –