sql >> Databáze >  >> RDS >> Sqlserver

Iterujte řádky v SQL Server 2008

Pokud musíte iterate(*), použijte konstrukci určenou k tomu – kurzor . Hodně pomlouvané, ale pokud to nejjasněji vyjadřuje vaše záměry, říkám, použijte to:

DECLARE @ID int
DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter

OPEN IDs
FETCH NEXT FROM IDs into @ID
WHILE @@FETCH_STATUS = 0
BEGIN
    exec myproc @ID

    FETCH NEXT FROM IDs into @ID
END

CLOSE IDs
DEALLOCATE IDs

(*) Tato odpověď nedávno získala několik kladných hlasů, ale mám pocit, že bych sem měl také začlenit svůj původní komentář a přidat nějaké obecné rady:

V SQL byste měli obecně hledat řešení založené na sadě. Celý jazyk je orientován na řešení založená na množinách a optimalizátor se zase orientuje na to, aby řešení založená na množinách dobře fungovala. Dále pak nástroje, které máme k dispozici pro ladění optimalizátor je také orientován na sadu - např. použití indexů na tabulky.

Existuje několik situace, kdy je iterace nejlepším přístupem. Těch je málo a lze je přirovnat k Jacksonovým pravidlům optimalizace – nedělejte to – a (pouze pro odborníky) to zatím nedělejte .

Mnohem lépe pro vás bude, když se nejprve pokusíte formulovat, co chcete z hlediska množiny všech řádků ovlivnit – jaké celkové změny má být dosaženo? - a pak se pokuste formulovat dotaz, který tento cíl zapouzdří. Pouze v případě, že dotaz vytvořený tímto způsobem nefunguje adekvátně (nebo existuje nějaká jiná komponenta, která není schopna dělat nic jiného než zabývat se každým řádkem jednotlivě), měli byste uvažovat iterace.



  1. Mysql přebalovací engine MyISAM na InnoDB

  2. SQL Dynamic ASC a DESC

  3. Podmíněná pomoc s dotazem SQL

  4. jqGrid – Jedinečné ID pro nový řádek