2012. augusztus 24., péntek

Mennyi az idő?

Mai villámkérdésünk: az alábbi kódban mi lehet a @num változó két szélső értéke (min/max)?

DECLARE @date datetime, @num float
SET @date = @num

És ha a @date típusa datetime2?

2012. augusztus 21., kedd

Update csavarral


Mi a történik  akkor, ha egy tábla rekordjait rangsorolnám, és ezt a rangsort rögzíteném is a tábla egy új 
oszlopában? Mondjuk így:
  1. UPDATE Buildings SET nRank = ROW_NUMBER() OVER (ORDER BY nHeight);  
Ez történik:

Windowed functions can only appear in the SELECT or ORDER BY clauses.

Szóval csak SELECT vagy ORDER BY. Szerencsére ez nem olyan nagy gond. Használhatunk CTE-t, beágyazott query-t vagy view-t, és már teljesítettük is a fenti megkötést. Hogy pontosan hogyan, az ebből a script-sorból kiderül. A CTE-s verziót be is kopizom ide (szerintem ez a legelegánsabb).

  1. WITH Ranking AS  
  2. (  
  3. SELECT  
  4.       nRank  
  5.       ,ROW_NUMBER() OVER (ORDER BY nHeight) AS nComputedRank  
  6. FROM  
  7.       Buildings  
  8. )  
  9.   
  10. UPDATE  
  11.       Ranking  
  12. SET  
  13.       nRank = nComputedRank;  
Nagy rekordszám esetén érdemes elgondolkodni egy indexelt temp tábla használatán. A lemezre írásnak ugyan van költsége, de lehet, hogy ezt az indexek miatt bőven behozzuk az update-nél.