05 May 2010

Rinumera record con una sola update

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
 DROP TABLE #tmp

SELECT IdArgomento, IdPagina, OrdineVis 
INTO #tmp 
FROM PagineArgomenti_tb 
WHERE IdArgomento = 171 
ORDER BY OrdineVis 


DECLARE @Newpos smallint
SELECT @Newpos = 0


UPDATE #tmp 
SET  @Newpos = OrdineVis = @Newpos + 10 


UPDATE p
SET  p.OrdineVis = t.OrdineVis 
FROM PagineArgomenti_tb p 
  INNER JOIN #tmp t 
   ON p.IdArgomento = t.IdArgomento 
   AND p.IdPagina = t.IdPagina



Oppure, con la funzione ROW_NUMBER()
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
 DROP TABLE #tmp

SELECT IdArgomento, IdPagina, ROW_NUMBER() OVER (ORDER BY OrdineVis) AS OrdineVis 
INTO #tmp 
FROM PagineArgomenti_tb 
WHERE IdArgomento = 171 


UPDATE p
SET  p.OrdineVis = t.OrdineVis 
FROM PagineArgomenti_tb p 
  INNER JOIN #tmp t 
   ON p.IdArgomento = t.IdArgomento 
   AND p.IdPagina = t.IdPagina

L'ORDER BY è dentro la OVER().
Se voglio un progressivo e basta, si può fare ROW_NUMBER() OVER (ORDER BY GETDATE())