2009-11-04 56 views
23

Làm cách nào để chạy thủ tục được lưu trữ tại một thời điểm cụ thể mỗi ngày trong Phiên bản SQL Server Express?Làm thế nào để chạy một thủ tục được lưu trữ mỗi ngày trong SQL Server Express Edition?

Ghi chú:

  • này là cần thiết để cắt một bảng kiểm toán
  • Một thay thế sẽ được sửa đổi truy vấn chèn nhưng điều này có lẽ là kém hiệu quả
  • SQL Server Express Edition không có SQL Agent máy chủ

câu hỏi liên quan:

+0

Bài đăng này có vẻ thú vị (được tham chiếu trong câu trả lời cho một trong các câu hỏi có liên quan): http://www.sqlteam.com/article/scheduling-jobs-in-sql-server-express –

Trả lời

0

Bạn có thể sử dụng Task Scheduler để bắn một ứng dụng giao diện điều khiển đơn giản mà sẽ thực hiện câu lệnh SQL.

4

Nếu bạn đang sử dụng Express Edition, bạn sẽ cần phải sử dụng Windows Scheduler hoặc ứng dụng kết nối đến máy chủ một cách nào đó.

Bạn sẽ sử dụng lịch trình để chạy sqlcmd. Here are some instructions để nhận được sqlcmd hoạt động với ấn bản nhanh.

0

Như các bạn đã ghi nhận một cách chính xác mà không cần quá trình đại lý, bạn sẽ cần một cái gì đó khác bên ngoài vào máy chủ, có lẽ là một dịch vụ mà bạn viết và cài đặt hoặc Windows Scheduler. Lưu ý rằng với cài đặt Express cho ứng dụng cục bộ, có thể máy không thể bật vào thời điểm bạn muốn cắt bớt bảng (giả sử bạn đặt nó cắt ngắn mỗi đêm vào lúc nửa đêm, nhưng người dùng không bao giờ có máy của mình trên). Vì vậy, nhiệm vụ theo lịch của bạn sẽ không bao giờ chạy và nhật ký kiểm tra của bạn bị mất kiểm soát (đây cũng là vấn đề với SQL Server Agent, nhưng người ta cho rằng máy chủ thực sự sẽ chạy không ngừng). Một chiến lược tốt hơn nếu tình huống này phù hợp với bạn có thể là để ứng dụng thực hiện theo yêu cầu khi phát hiện thấy nó đã hơn X ngày kể từ khi cắt ngắn hoặc bất kỳ hoạt động của bạn là gì.

Một điều cần xem xét là nếu bạn đang nói về một ứng dụng Web, có thể là thời gian khi ứng dụng được tải, và các hoạt động có thể được thực hiện khi mà sự kiện cháy.

Như đã đề cập trong nhận xét, có sp_procoption - điều này có thể cho phép SP của bạn chạy mỗi lần khởi động động cơ - và nó vẫn có vấn đề nếu động cơ không chạy vào thời điểm bạn cần thực hiện thao tác.

+0

sp_procoption sẽ cho phép lưu trữ thủ tục để chạy tự động. –

8

tôi thấy cơ chế sau đây làm việc cho tôi.

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 

Một số lưu ý:

  • Điều đáng viết một entry kiểm toán ở đâu đó để bạn có thể thấy rằng các truy vấn thực sự chạy.
  • Máy chủ cần khởi động lại một lần để đảm bảo rằng tập lệnh chạy lần đầu tiên.
+0

Cùng với đường mòn kiểm toán của bạn, tôi sẽ thêm vào đó proc được lưu trữ một kiểm tra lịch sử quá trình, để nếu nó không được chạy trong 24 giờ hoặc bất cứ điều gì - để đi trước và chạy quá trình lúc khởi động. Điều này sẽ xử lý các trường hợp khi máy bị tắt trong đêm hoặc các đêm không thường xuyên hoặc tương tự (một máy ảo được quay lên theo yêu cầu). –

+0

Điểm tốt! Đối với trường hợp của chúng tôi, cơ sở dữ liệu chạy liên tục vì nó là một hệ thống khách hàng chạy 24x7. Tôi tự hỏi nếu điều đơn giản nhất để làm là chạy kịch bản 'MyDatabaseStoredProcedure' trước khi chờ? Trong trường hợp của chúng tôi điều này sẽ làm việc tốt nhưng nó có thể không cho một yêu cầu ứng dụng khác nhau. –

+0

Có bất kỳ nhược điểm nào để có quy trình chạy liên tục trong nền không? – tufelkinder

2

SQL Scheduler từ http://www.lazycoding.com/products.aspx

  • miễn phí và đơn giản
  • Hỗ trợ tất cả các phiên bản của SQL Server 2000, 2005, và 2008
  • Hỗ trợ không giới hạn các trường hợp SQL Server với một số lượng không giới hạn của công việc .
  • Cho phép dễ dàng sắp xếp các nhiệm vụ SQL Server bảo trì: sao lưu, chỉ số xây dựng lại, kiểm tra tính toàn vẹn vv
  • Chạy như Windows Service
  • thông báo email trên thành công việc và suy
1

Từ một câu hỏi tương tự đã được hỏi và có thể sẽ bị đóng dưới dạng bản trùng lặp này và có nhiều tùy chọn không được đề cập trong câu trả lời đã có ở đây ...

Vì bạn đang sử dụng SQL Express bạn không thể sử dụng S QL Server Agent. Tuy nhiên có rất nhiều lựa chọn thay thế, tất cả trong số đó bạn có thể lên lịch sử dụng AT hoặc Windows Task Scheduler tùy thuộc vào hệ điều hành của bạn:

Tất cả những ngôn ngữ/công cụ (và nhiều công cụ khác) có khả năng kết nối với SQL Server và thực thi thủ tục ored. Bạn cũng có thể thử những thay thế Agent:

3

Tạo một nhiệm vụ theo lịch trình đó gọi là "C: \ YourDirNameHere \ TaskScript.vbs" khi khởi động. VBScript nên thực hiện thực hiện nhiệm vụ lặp đi lặp lại (trong ví dụ này, đó là một vòng 15 phút)

Via dòng lệnh (phải chạy cmd.exe as administrator):

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

Ví dụ TaskScript.vbs: Đây thực hiện tùy chỉnh của bạn SQL script âm thầm bằng cách sử dụng RunSQLScript.dơi

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: này sử dụng sqlcmd gọi trường hợp cơ sở dữ liệu và thực thi kịch bản SQL

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

+1 Câu trả lời hay :) –

+0

Tôi cần sửa lệnh nhiệm vụ lịch biểu (thông qua dòng lệnh). Nó chỉ ra nó không tự động khởi động lại vào khởi động tiếp theo và tôi đã phải tự sửa nó. Tôi sẽ chỉnh sửa và sửa mã sau, chỉ muốn mọi người biết. Mã thực thi hoạt động tốt mặc dù. – VoteCoffee

+0

Vẫn đang bận? Hoặc bạn có thời gian để sửa chữa lệnh để làm cho câu trả lời này hoàn thành? –

1

Cách đơn giản nhất tôi đã tìm thấy để giải quyết vấn đề này là để tạo ra một truy vấn mà thực thi thủ tục lưu trữ sau đó lưu nó. Truy vấn sẽ trông giống như truy vấn dưới đây.

 use [database name] 
    exec storedproc.sql 

Sau đó, tạo tệp hàng loạt với một cái gì đó tương tự như mã bên dưới trong đó.

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

Sau đó, có lên lịch công việc thực hiện hàng loạt thường xuyên như bạn muốn

0

Công ty chúng tôi cũng sử dụng SQLEXPRESS và không có chất độc SQL.

Vì không có câu trả lời được đánh dấu là "đúng" và tất cả các giải pháp khá phức tạp, tôi sẽ chia sẻ những gì tôi đã làm ở đó. Có thể nó thực sự tồi tệ, nhưng nó làm việc rất tốt với tôi.

Tôi đã chọn các hoạt động Chèn (người làm) vào bảng có cùng phạm vi thời gian tôi cần và kích hoạt "ON INSERT" áp dụng chức năng cần thiết.

Các vấn đề liên quan