web-dev-qa-db-fra.com

Exécution planifiée d'une procédure stockée sur un serveur SQL

Est-il possible de configurer Microsoft SQL Server pour exécuter une procédure stockée sur une base régulière?

59

Oui, dans MS SQL Server, vous pouvez créer des travaux planifiés. Dans SQL Management Studio, accédez au serveur, puis développez l'élément Agent SQL Server, puis le dossier Travaux pour afficher, modifier et ajouter des travaux planifiés.

98
Jeb

Si MS SQL Server Express Edition est utilisé, SQL Server Agent n'est pas disponible. J'ai trouvé ce qui suit fonctionné pour toutes les éditions:

USE Master
GO

IF  EXISTS( SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(N'[dbo].[MyBackgroundTask]')
            AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[MyBackgroundTask]
GO

CREATE PROCEDURE MyBackgroundTask
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- The interval between cleanup attempts
    declare @timeToRun nvarchar(50)
    set @timeToRun = '03:33:33'

    while 1 = 1
    begin
        waitfor time @timeToRun
        begin
            execute [MyDatabaseName].[dbo].[MyDatabaseStoredProcedure];
        end
    end
END
GO

-- Run the procedure when the master database starts.
sp_procoption    @ProcName = 'MyBackgroundTask',
                @OptionName = 'startup',
                @OptionValue = 'on'
GO

Quelques notes:

38
Thomas Bratt

Oui, si vous utilisez l'agent SQL Server.

Ouvrez votre Enterprise Manager et accédez au dossier Management sous l’instance SQL Server qui vous intéresse. Vous y verrez l’agent SQL Server et, en dessous, une section Jobs.

Ici, vous pouvez créer un nouveau travail et vous verrez une liste des étapes que vous devrez créer. Lorsque vous créez une nouvelle étape, vous pouvez spécifier l'étape d'exécution réelle d'une procédure stockée (tapez TSQL Script). Choisissez la base de données, puis pour la section de commande, mettez quelque chose comme:

exec MyStoredProcedure

C’est l’aperçu général, postez ici si vous avez besoin de conseils supplémentaires.

[J'ai en fait pensé que je pourrais être le premier sur celui-ci, mon garçon, je me suis trompé :)]

17
Ciaran Archer

Probablement pas la réponse que vous cherchez, mais je trouve plus utile d’utiliser simplement Planificateur de tâches Windows Server

Vous pouvez utiliser directement la commande sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob"

Ou même créer un .bat fichier. Vous pouvez donc même cliquer deux fois sur la tâche à la demande.

Ceci a également été abordé dans ce ICI

8
percebus

J'ajouterai une chose: à l'endroit où je me trouvais, nous avions l'habitude de travailler par lots, tous les soirs. Cependant, nous nous écartons de cela pour utiliser une application client planifiée dans des tâches planifiées Windows qui lancent chaque travail. Il y a (au moins) trois raisons à cela:

  1. Certains programmes de console doivent également être exécutés tous les soirs. De cette façon, toutes les tâches planifiées peuvent être au même endroit. Bien sûr, cela crée un point d’échec unique, mais si les tâches de la console ne sont pas exécutées, nous perdrons de toute façon une journée de travail le lendemain.
  2. Le programme qui lance les travaux capture les messages d'impression et les erreurs du serveur et les écrit dans un journal d'application commun pour tous nos processus de traitement par lots. Il est beaucoup plus simple de se connecter depuis les travaux SQL.
  3. Si nous devons un jour mettre à niveau le serveur (et nous espérons le faire bientôt), nous n’avons pas à nous inquiéter du transfert des travaux. Il suffit de re-pointer l'application une fois.

C'est une application VB.Net très courte: je peux poster du code si quelqu'un est intéressé.

6
Joel Coehoorn

Vous pouvez utiliser SQL Server Service Broker pour créer un mécanisme personnalisé.

Idée (simplifiée):

  1. Écrivez une procédure stockée/un déclencheur qui commence une conversation ( BEGIN DIALOG ) sous forme de boucle (FROM my_service TO my_service) - récupère le gestionnaire de conversation

    DECLARE @dialog UNIQUEIDENTIFIER;
    
    BEGIN DIALOG CONVERSATION @dialog
            FROM SERVICE   [name] 
            TO SERVICE      'name' 
            ...;
    
  2. Démarrer le chronomètre de conversation

    DECLARE @time INT;
    BEGIN CONVERSATION TIMER (@dialog)  TIMEOUT = @time;
    
  3. Après un nombre de secondes spécifié, un message sera envoyé à un service. Il sera mis en file d'attente avec la file d'attente associée.

    CREATE QUEUE queue_name WITH STATUS = ON, RETENTION = OFF
                 , ACTIVATION (STATUS = ON, PROCEDURE_NAME = <procedure_name>
                 , MAX_QUEUE_READERS = 20, EXECUTE AS N'dbo')
                  , POISON_MESSAGE_HANDLING (STATUS = ON) 
    
  4. La procédure exécutera un code spécifique et une minuterie récupérable pour se déclencher à nouveau.


Vous pouvez trouver une solution complètement préparée (T-SQL) écrite par Michał Gołoś appelé Planificateur de tâches

Points clés du blog:

Avantages:

  • Pris en charge sur chaque version (de Express à Enterprise). Le travail d'agent SQL Server n'est pas disponible pour SQL Server Express
  • Portée au niveau de la base de données. Vous pouvez facilement déplacer la base de données avec les tâches associées (en particulier lorsque vous devez déplacer environ 100 tâches d'un environnement à un autre)
  • Privilèges inférieurs nécessaires pour voir/manipuler les tâches (niveau base de données)

Distinction proposée:

Agent SQL Server (maintenance):

  • des sauvegardes
  • reconstruction d'index/statistiques
  • réplication

Planificateur de tâches (processus métier):

  • supprimer les anciennes données
  • pré-agrégations/recalculs cycliques
  • dénormalisation

Comment le configurer:

  • obtenir le code source de la section: "Do pobrania" - Pour télécharger (activation du courtier/configuration du schéma tsks/table de configuration + déclencheurs + procédure stockée)/configuration des éléments du courtier)
  • configurer la table de configuration [tsks].[tsksx_task_scheduler] pour ajouter de nouvelles tâches (les noms des colonnes sont auto-descriptifs, exemple de tâche inclus)

Avertissement: le blog est écrit en polonais mais le code source associé est en anglais et il est facile à suivre.

Avertissement 2: avant de l'utiliser, assurez-vous de l'avoir testé dans un environnement autre que celui de production.

4
Lukasz Szozda

Utilisation de Management Studio - Vous pouvez créer un travail (sous SQL Server Agent). Un travail peut inclure plusieurs étapes, allant des scripts T-SQL aux packages SSIS.

Jeb était plus rapide;)

4
Bluenuance
3
Cade Roux