Comment est-il possible d'exécuter une procédure stockée à une heure donnée chaque jour dans SQL Server Express Edition?
Remarques:
Questions connexes:
SQL Server Express n'étant pas fourni avec SQL Agent, vous pouvez utiliser le planificateur Windows pour exécuter un SQLCMD avec un proc ou un script SQL stocké.
J'ai trouvé le mécanisme suivant a fonctionné pour moi.
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:
Créez une tâche planifiée qui appelle "C:\YourDirNameHere\TaskScript.vbs" au démarrage. VBScript doit exécuter des tâches répétées (dans cet exemple, il s’agit d’une boucle de 15 minutes)
Via la ligne de commande (doit exécuter cmd.exe en tant qu'administrateur):
schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP
Exemple TaskScript.vbs: Ceci exécute votre script SQL personnalisé en mode silencieux à l'aide de RunSQLScript.bat
Do While 1
WScript.Sleep(60000*15)
Set WshShell = CreateObject("WScript.Shell")
WshShell.RUN "cmd /c C:\YourDirNameHere\RunSQLScript.bat C:\YourDirNameHere\Some_TSQL_Script.sql", 0
Loop
RunSQLScript.bat: Ceci utilise sqlcmd pour appeler l'instance de base de données et exécuter le script SQL
@echo off
sqlcmd -S .\SQLEXPRESS -i %1
Si vous utilisez Express Edition, vous devrez utiliser le planificateur Windows ou l'application qui se connecte au serveur d'une manière ou d'une autre.
Vous utiliseriez le planificateur pour exécuter sqlcmd. Voici quelques instructions pour que sqlcmd fonctionne avec l'édition express.
SQL Scheduler à partir de http://www.lazycoding.com/products.aspx
Puisqu'une autre question similaire a été posée, et sera probablement fermée comme une copie de celle-ci, et il y a beaucoup d'options non mentionnées dans les réponses déjà présentes ici ...
Puisque vous utilisez SQL Express, vous ne pouvez pas utiliser SQL Server Agent. Cependant, il existe de nombreuses alternatives que vous pouvez planifier à l’aide de À ou Planificateur de tâches Windows en fonction de votre système d’exploitation:
Tous ces langages/outils (et beaucoup d’autres) ont la capacité de se connecter à SQL Server et d’exécuter une procédure stockée. Vous pouvez également essayer ces remplacements d’agent:
Le moyen le plus simple que j'ai trouvé pour résoudre ce problème est de créer une requête qui exécute la procédure stockée, puis enregistrez-la. La requête devrait ressembler à celle ci-dessous.
use [database name]
exec storedproc.sql
Créez ensuite un fichier de commandes contenant quelque chose de similaire au code ci-dessous.
sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql
Ensuite, demandez au planificateur de tâches d'exécuter le lot aussi souvent que vous le souhaitez.
Comme vous l'avez correctement noté, sans le processus d'agent, vous aurez besoin de quelque chose d'autre externe au serveur, par exemple un service que vous écrivez et installez ou un planificateur Windows.
Notez qu’avec une installation Express pour une application locale, il est possible que la machine ne soit pas allumée au moment où vous voulez tronquer la table (disons que vous la définissez pour la tronquer tous les soirs à minuit, mais l’utilisateur n’a jamais sa machine allumée. ).
Ainsi, votre tâche planifiée n'est jamais exécutée et votre journal d'audit devient incontrôlable (c'est également un problème avec SQL Server Agent, mais on pourrait supposer qu'un serveur réel fonctionnerait de manière non-stop). Une meilleure stratégie si cette situation correspond à la vôtre serait peut-être que l'application le fasse à la demande lorsqu'elle détecte qu'il s'est écoulé plus de X jours depuis la troncature ou quelle que soit votre opération.
Une autre chose à examiner est que si vous parlez d'une application Web, le chargement de l'application peut arriver, et l'opération peut être effectuée lorsque cet événement est déclenché.
Comme mentionné dans le commentaire, il existe sp_procoption - ceci pourrait permettre à votre SP de s'exécuter à chaque démarrage du moteur - les inconvénients de cette méthode sont que, pour les instances longues, il peut y avoir une longue le temps entre les appels et des problèmes subsistent si le moteur ne tourne pas au moment où vous souhaitez que l'opération soit effectuée.
Une autre approche de la planification dans SQL Express consiste à utiliser Timers de conversation Service Broker . Pour exécuter périodiquement une procédure stockée que vous pouvez utiliser pour amorcer un planificateur personnalisé.
Voir par exemple Planification de travaux dans SQL Server Express
Notre société utilise également SQLEXPRESS et il n’existe aucun agent SQL.
Puisqu'il n'y a pas de réponse marquée comme "juste" et que toutes les solutions sont assez complexes, je vais partager ce que j'ai fait là-bas. Peut-être que c'est vraiment mauvais, mais cela a très bien fonctionné pour moi.
J'ai choisi les opérations d'insertion (les gens le font) sur une table dont le temps est proche de celui dont j'avais besoin et créé un déclencheur "ON INSERT" qui applique la fonction nécessaire.
Vous pouvez utiliser le Planificateur de tâches pour lancer une application de console simple qui exécuterait l'instruction Sql.