2009-11-04 18 views
23

Come è possibile eseguire una stored procedure in un determinato orario ogni giorno in SQL Server Express Edition?Come eseguire una stored procedure ogni giorno in SQL Server Express Edition?

Note:

  • Ciò è necessario per troncare una tabella di controllo
  • Un'alternativa sarebbe quella di modificare la query di inserimento, ma questo è probabilmente meno efficace
  • SQL Server Express Edition non ha lo SQL

Domande correlate Server Agent:

+0

Questo post sembra interessante (a cui si fa riferimento in una risposta a una delle domande correlate): http://www.sqlteam.com/article/scheduling-jobs-in-sql-server-express –

risposta

0

Si potrebbe utilizzare Utilità di pianificazione per sparare una semplice console app che eseguire l'istruzione SQL.

4

Se si utilizza Express Edition, sarà necessario utilizzare l'Utilità di pianificazione di Windows o l'applicazione che si connette al server in qualche modo.

Si utilizzerà lo scheduler per eseguire sqlcmd. Here are some instructions per far sì che sqlcmd funzioni con Express Edition.

0

Come è stato correttamente notato, senza il processo dell'agente, sarà necessario qualcos'altro esterno al server, forse un servizio che si scrive e installa o lo schedulatore di Windows.

Si noti che con un'installazione Express per un'applicazione locale, è possibile che la macchina non sia accesa nel momento in cui si desidera troncare la tabella (ad esempio, si imposta di troncare ogni notte a mezzanotte, ma l'utente non lo fa mai ha la sua macchina accesa).

Quindi l'attività pianificata non viene mai eseguita e il registro di controllo diventa fuori controllo (questo è un problema anche con SQL Server Agent, ma si presume che un server reale sia in esecuzione non-stop). Una strategia migliore se questa situazione si adatta alla tua potrebbe essere quella di fare in modo che l'applicazione lo richieda quando rileva che sono trascorsi più di X giorni dal troncamento o da qualsiasi altra operazione.

Un'altra cosa da considerare è che se si sta parlando di un'applicazione Web, potrebbe esserci un momento in cui l'applicazione viene caricata e l'operazione potrebbe essere eseguita quando l'evento viene attivato.

Come menzionato nel commento, c'è sp_procoption - questo potrebbe consentire l'esecuzione del tuo SP ogni volta che il motore viene avviato - gli svantaggi con questo metodo sono quelli per le istanze di lunga durata, potrebbe essere molto tempo tra le chiamate, e ha ancora problemi se il motore non è in esecuzione nei momenti in cui è necessario eseguire l'operazione.

+0

sp_procoption consentirà una memorizzazione procedura per l'esecuzione automatica. –

8

Ho trovato il seguente meccanismo ha funzionato per me.

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 

Alcune note:

  • Vale la pena di scrivere una voce di controllo da qualche parte in modo che si può vedere che la query in realtà ha funzionato.
  • Il server deve essere riavviato una volta per garantire che lo script venga eseguito la prima volta.
+0

Insieme alla traccia di controllo, aggiungerei a tale stored procedure un controllo della cronologia del processo, in modo che se non è stato eseguito in 24 ore o in qualsiasi altro modo, per andare avanti e avviare il processo all'avvio. Questo gestirà i casi in cui la macchina si spegne durante la notte o notti occasionali o simili (una VM che viene attivata su richiesta). –

+0

Buon punto! Nel nostro caso, il database viene eseguito continuamente in quanto è un sistema cliente eseguito 24 ore su 24, 7 giorni su 7. Mi chiedo se la cosa più semplice da fare sia eseguire lo script 'MyDatabaseStoredProcedure' prima dell'attesa? Nel nostro caso ciò funzionerebbe bene ma potrebbe non essere un requisito di applicazione diverso. –

+0

Ci sono degli svantaggi nell'avere una procedura costantemente in esecuzione in background? – tufelkinder

2

SQL Scheduler da http://www.lazycoding.com/products.aspx

  • libero e semplice
  • Supporta tutte le versioni di SQL Server 2000, 2005, e nel 2008
  • Supporta le istanze illimitate di SQL Server con un numero illimitato di posti di lavoro .
  • Consente di programmare facilmente le attività di manutenzione di SQL Server: backup, indice ricostruisce, controlli di integrità, ecc
  • viene eseguito come servizio di Windows
  • notifiche e-mail in caso di successo di posti di lavoro e il fallimento
1

Dal un'altra domanda simile è stato chiesto, e sarà probabilmente chiuso come duplicato di questo, e ci sono molte opzioni non menzionate nelle risposte già presenti qui ...

Poiché si utilizza SQL Express non è possibile utilizzare S Agente server QL. Tuttavia ci sono molte alternative, ognuno dei quali è possibile pianificare con AT o Windows Task Scheduler a seconda del sistema operativo:

Tutti questi lingue/strumenti (e molti altri) hanno la capacità di connettersi a SQL Server ed eseguire una st procedura orale. Potete anche provare queste sostituzioni Agente:

3

creare un'attività pianificata che chiama "C: \ YourDirNameHere \ TaskScript.vbs" all'avvio. VBScript deve eseguire esecuzione dell'attività ripetuto (in questo esempio, è a 15 minuti di anello)

Via riga di comando (deve eseguire cmd.exe come amministratore):

schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP 

Esempio TaskScript.vbs: Esegue la vostra abitudine Script SQL silenziosamente con 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: Questo utilizza sqlcmd per richiamare l'istanza del database ed eseguire lo script SQL

@echo off 
sqlcmd -S .\SQLEXPRESS -i %1 
+0

+1 Risposta piacevole :) –

+0

Ho bisogno di correggere il comando della pianificazione delle attività (tramite la riga di comando). Si scopre che non si riavvia automaticamente al prossimo avvio e ho dovuto correggerlo manualmente. Modificherò e correggerò il codice in seguito, volevo solo che le persone fossero a conoscenza. Il codice di esecuzione funziona benissimo però. – VoteCoffee

+0

Ancora occupato? O hai il tempo di correggere il comando per completare questa risposta? –

1

Il modo più semplice che ho trovato per affrontare questo problema è quello di creare una query che esegue il stored procedure quindi salvarlo. La query dovrebbe essere simile a questa in basso.

 use [database name] 
    exec storedproc.sql 

Quindi creare un file batch con qualcosa di simile al codice qui sotto.

sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql 

Poi hanno il task scheduler eseguire il batch come le volte che vuoi

0

La nostra azienda utilizza anche SQLEXPRESS e non v'è alcun agente SQL.

Poiché non esiste una risposta contrassegnata come "corretta" e tutte le soluzioni sono piuttosto complesse, condividerò ciò che ho fatto lì. Potrebbe essere davvero brutto, ma ha funzionato benissimo con me.

Ho scelto le operazioni di inserimento (le persone lo fanno) in una tabella che ha ottenuto lo stesso intervallo di tempo necessario e ha attivato un trigger "ON INSERT" che applica la funzione necessaria.

Problemi correlati