Mamy procedurę składowaną, którą użytkownicy mogą uruchomić ręcznie, aby uzyskać zaktualizowane numery raportu, który jest stale używany przez cały dzień.
Mam drugą procedurę przechowywaną, która powinna zostać uruchomiona po uruchomieniu pierwszej procedury przechowywanej, ponieważ jest ona oparta na liczbach uzyskanych z tej pierwszej procedury przechowywanej, jednak jej uruchomienie trwa dłużej i dotyczy osobnego procesu, więc nie chcę zmusza użytkownika do czekania na uruchomienie drugiej procedury składowanej.
Czy istnieje sposób, aby jedna procedura przechowywana rozpoczęła drugą procedurę przechowywaną i powróciła natychmiast, nie czekając na wyniki?
Używam SQL Server 2005.
Odpowiedzi:
Wygląda na to, że istnieje wiele sposobów na osiągnięcie tego, ale najprostszym sposobem była sugestia Martina, aby skonfigurować procedurę w zadaniu SQL i uruchomić ją za pomocą asynchronicznej komendy sp_start_job z mojej procedury składowanej.
Działa to tylko dla mnie, ponieważ nie muszę określać żadnych parametrów dla mojej procedury składowanej.
Inne sugestie, które mogą działać w zależności od twojej sytuacji, to:
Asynchroniczne uruchamianie procesu w kodzie odpowiedzialnym za wykonanie procedury składowanej, jak sugerował Mr.Brownstone .
Nie jest to zły pomysł, jednak w moim przypadku procedura przechowywana jest wywoływana z wielu miejsc, więc znalezienie wszystkich tych miejsc i upewnienie się, że wywołują również drugą procedurę, nie wydawało się praktyczne. Również druga procedura przechowywana jest dość krytyczna, a jej pominięcie może spowodować poważne problemy dla naszej firmy.
źródło
EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.
Azure nie istnieje również ani broker usług, ani agent Sql. Nie wiem, dlaczego Microsoft, po półtorej dekadzie ludzi, odmawia dodaniaEXECUTE ASYNC RematerializeExpensiveCacheTable
.Możesz użyć brokera usług wraz z aktywacją w kolejce. Dzięki temu możesz opublikować parametry wywołania procedury w kolejce. Zajmuje to tyle samo czasu co wkładka. Po zatwierdzeniu transakcji i potencjalnie kilku sekundach aktywacja automatycznie wywoła procedurę odbiorcy asynchronicznie. To po prostu wuold musi wziąć parametry kolejki i wykonać pożądaną pracę.
źródło
To stare pytanie zasługuje na bardziej wyczerpującą odpowiedź. Niektóre z nich są wymienione w innych odpowiedziach / komentarzach tutaj, inne mogą, ale nie muszą, działać w konkretnej sytuacji OP, ale mogą działać dla innych, którzy szukają wywoływania przechowywanych procedur asynchronicznie z SQL.
Wystarczy być całkowicie jednoznaczne: TSQL czy nie (przez siebie) mają zdolność do uruchomienia innych operacji TSQL asynchronicznie .
To nie znaczy, że wciąż nie masz wielu opcji:
sp_start_job
. Jeśli chcesz programowo monitorować ich postęp, po prostu upewnij się, że zadania aktualizują niestandardową tabelę JOB_PROGRESS (lub możesz sprawdzić, czy zakończyły się jeszcze przy użyciu funkcji nieudokumentowanej,xp_sqlagent_enum_jobs
jak opisano w tym doskonałym artykule Gregory A. Larsen). Musisz utworzyć tyle osobnych zadań, ile chcesz, aby działały równoległe procesy, nawet jeśli działają na tym samym przechowywanym proc z różnymi parametrami.sp_oacreate
isp_oamethod
uruchom nowy proces, wywołując nawzajem przechowywane procedury, jak opisano w tym artykule , również przez Gregory'ego A. Larsena.Parallel_AddSql
iParallel_Execute
zgodnie z opisem w tym artykule Alana Kaplana (tylko SQL2005 +).Gdybym to był ja, prawdopodobnie użyłbym wielu zadań agenta SQL w prostszych scenariuszach, a pakiet SSIS w bardziej złożonych scenariuszach.
W twoim przypadku wywoływanie zadań SQL Agent brzmi jak prosty i łatwy do zarządzania wybór.
Ostatni komentarz : SQL już teraz próbuje zrównoważyć poszczególne operacje, kiedy tylko jest to możliwe *. Oznacza to, że uruchomienie 2 zadań jednocześnie zamiast po sobie nie gwarantuje, że zakończy się wcześniej. Przetestuj dokładnie, aby zobaczyć, czy rzeczywiście coś poprawia, czy nie.
Mieliśmy programistę, który utworzył pakiet DTS do uruchamiania 8 zadań jednocześnie. Niestety był to tylko serwer 4-procesorowy :)
* Zakładając domyślne ustawienia. Można to zmodyfikować, zmieniając maksymalny stopień równoległości lub maskę koligacji na serwerze, lub stosując wskazówkę dotyczącą zapytania MAXDOP.
źródło
Tak, jedna metoda:
źródło
sp_start_job
aby ją uruchomić lub dynamicznie tworzyć zadania w razie potrzeby, aby uniknąć odpytywania co minutę, ale złożoność w tym przypadku prawdopodobnie oznacza, że nie będzie prostsza niż broker usług.sp_start_job
wraca natychmiast. Nie pamiętam jednak, jakich uprawnień potrzebuje.Inną możliwością byłoby uzyskanie pierwszej procedury składowanej w celu zapisania do tabeli kontroli po jej zakończeniu i umieszczenie wyzwalacza w tabeli kontroli, która uruchamia drugą procedurę przechowywaną, gdy tabela kontroli zostanie zapisana. Nie ma potrzeby ciągłego odpytywania ani dodatkowej pracy agenta SQL Server.
źródło
INSERT
lubUPDATE
, a nie asynchronicznie, więc Martin ma rację, że pierwsza procedura nadal kończy się na czekaniu, aż druga procedura zakończy się powrotem.