2009-09-28 15 views
8

Necesito actualizar las primeras N filas en una tabla que cumpla una condición.¿Cómo actualizo n filas en una tabla?

Sé que puedo hacer una Actualización Top N ... pero el problema es que N está en una @variable.

ACTUALIZACIÓN TOP @N SET ... no funciona.

¿Hay alguna manera de hacer esto que me falta?

No hay definiciones de tabla específicas aquí porque no importa de qué columnas sean. Si puedo hacerlo para una tabla de una columna, puedo hacerlo para mi tabla.

Respuesta

16

Es necesario utilizar parens después TOP cláusula cuando se desea utilizar una variable:

UPDATE TOP(@N) ... 
+0

Truco Cool! Gracias por enseñármelo. Curiosamente, esta misma sintaxis no funciona con la construcción 'SELECT TOP n'. Puedo entender por qué sucedería eso, aunque es algo así como una asimetría extraña en TSQL. – mjv

+0

'SELECT TOP n' funciona solo si' n' es una constante, no una variable. Funcionó así antes de 2005. 'TOP' con un argumento variable y' TOP' para declaraciones DML se ha agregado desde 2005 y requiere parens. –

+0

Esto sería genial, sin embargo, "update top (@N) set systemuserid = @ID donde systemuserid es nulo" me da "Sintaxis incorrecta cerca de la palabra clave 'set'". – Moose

10
WITH q AS 
     (
     SELECT TOP (@r) * 
     FROM mytable 
     ORDER BY 
       col1 
     ) 
UPDATE q 
SET  co12 = @value 

UPDATE TOP (@r) funciona, pero se actualizará ningún @r filas en ningún orden en particular.

Desde el documentation:

Las filas que se hace referencia en la expresión TOP utilizar con INSERT, UPDATE, o DELETE no están dispuestas en cualquier orden. TOP n devuelve n filas aleatorias.

+0

'@ KM': esta vez corregí la declaración * antes * apuntaste :) – Quassnoi

+0

+1, me enteré de que aprendí, así que pruebo un montón de código, nunca vi una ACTUALIZACIÓN de un CTE, voy a tiene que jugar con eso un poco ... –

+0

'@ KM': muy útil para eliminar duplicados. http://explainextended.com/2009/03/14/deleting-duplicates/ – Quassnoi

Cuestiones relacionadas