Máme uloženou proceduru, kterou mohou uživatelé spustit ručně, aby získali některá aktualizovaná čísla pro sestavu, která se neustále používá po celý den.
Mám druhou uloženou proceduru, která by měla být spuštěna po spuštění první uložené procedury, protože je založena na číslech získaných z této první uložené procedury, ale spuštění trvá déle a je pro samostatný proces, takže nechci donutí uživatele čekat, až bude spuštěna tato 2. uložená procedura.
Existuje způsob, jak jednu uloženou proceduru spustit druhou uloženou proceduru a okamžitě se vrátit bez čekání na výsledky?
Používám SQL Server 2005.
Vypadá to, že toho lze dosáhnout několika způsoby, ale našel jsem nejjednodušší způsob, jak Martinův návrh nastavení procedury v SQL úloze a její spuštění pomocí asynchronního sp_start_job = příkaz z mé uložené procedury.
EXEC msdb.dbo.sp_start_job @job_name='Run2ndStoredProcedure'
Toto funguje pouze pro mě, protože pro svou uloženou proceduru nemusím specifikovat žádné parametry.
Další návrhy, které mohou fungovat v závislosti na vaší situaci, jsou
Spuštění procesu asynchronně v kódu, který je zodpovědný za provedení uložené procedury, jako Mr.Brownstone navrhl .
Není to špatný nápad, ale v mém případě je uložená procedura vyvolána z více míst, takže nalezení všech těchto míst a zajištění, že nazývají druhou proceduru, se nezdálo být praktické. Také druhá uložená procedura je velmi kritická a zapomněl ji spustit, může to způsobit některé velké problémy pro naši společnost.
Tato stará otázka si zaslouží komplexnější odpověď. Některé z nich jsou uvedeny v jiných odpovědích/komentářích, jiné mohou nebo nemusí fungovat pro konkrétní situaci OP, ale mohou fungovat pro ostatní, kteří hledají asynchronní volání uložených proců z SQL.
Jednoduše řečeno: TSQL nedělá (sama o sobě) mají schopnost spustit asynchronně další operace TSQL .
To neznamená, že stále nemáte mnoho možností:
sp_start_job
. Pokud potřebujete programově sledovat jejich průběh, ujistěte se, že všechny úlohy aktualizují vlastní tabulku JOB_PROGRESS (nebo můžete zkontrolovat, zda již skončily pomocí nezdokumentované funkce xp_sqlagent_enum_jobs
jak je popsáno v tento vynikající článek Gregory A. Larsen). Musíte vytvořit tolik samostatných úloh, kolikrát chcete, aby byly spuštěny paralelní procesy, i když běží stejný uložený proces s různými parametry.sp_oacreate
a sp_oamethod
zahájit nový proces volající si navzájem uložené proc, jak je popsáno v tento článek , také Gregory A. Larsen.Parallel_AddSql
a Parallel_Execute
jak je popsáno v tento článek Alan Kaplan (pouze SQL2005 +).Kdybych to byl já, pravděpodobně bych použil více úloh SQL Agent Jobs v jednodušších scénářích a balíček SSIS ve složitějších scénářích.
Ve vašem případě zní volání úloh SQL Agent jako jednoduchá a zvládnutelná volba.
Jeden poslední komentář : SQL se již pokouší paralelizovat jednotlivé operace, kdykoli může *. To znamená, že spuštění 2 úkolů současně místo za sebou není zárukou, že bude dokončena dříve. Pečlivě otestujte, zda skutečně něco zlepšuje nebo ne.
Měli jsme vývojáře, který vytvořil balíček DTS =================================================================================================================
* Předpokládané výchozí nastavení. To lze upravit změnou maximálního stupně paralelismu nebo masky spřažení serveru nebo pomocí nápovědy MAXDOP dotazu.
Můžete použít servisního makléře společně s aktivací ve frontě. S tím byste mohli poslat parametry pro volání procedury do fronty. To zabere tolik času jako vložka. Poté, co je transakce potvrzena a případně ještě několik sekund, by aktivace automaticky vyvolala proceduru příjemce asynchronně. Pak musí jen převzít parametry fronty a provést požadovanou práci.
Ano, jedna metoda:
Další možností by bylo získat první uloženou proceduru, která se zapíše do tabulky auditu, když se dokončí, a umístit na auditovací tabulku spouštěč, který spustí druhou uloženou proceduru, když se zapíše kontrolní tabulka. Není třeba průběžně dotazovat a není třeba další úloha SQL Server Agent.