【问题标题】:How do I create a SQL Server agent without using a GUI?如何在不使用 GUI 的情况下创建 SQL Server 代理?
【发布时间】:2010-11-22 19:01:12
【问题描述】:

我正在使用 Angel LMS 及其构建在 SQL Server 平台上。我相信它是 2005 年,但不是 100% 肯定。

无论如何,也许我的伪代码会阐明这个答案。字符串也必须使用单引号,连接字符是+。

我需要每天运行 2-5 次(频率尚未确定,但你明白了)。这是交易块/伪代码:

BEGIN TRANSACTION
BEGIN TRY

<select statement>
<update statement>
<delete statement>
<insert statement>

COMMIT TRANSACTION
END TRY
BEGIN CATCH
        ROLLBACK TRANSACTION
        DECLARE @Msg NVARCHAR(MAX)  
        SELECT @Msg=ERROR_MESSAGE() 
        RAISERROR('Error Occured: %s', 20, 101,@msg) WITH LOG
END CATCH

我对数据库的唯一访问权限是运行 sql 命令的文本框。我可以创建和删除表、运行事务块,并且显然可以选择/插入/更新/删除。我找不到任何创建代理的命令,只有在您使用企业管理器或任何 GUI 调用时的步骤。

此外,有关如何操纵代理的时间安排的一些参考资料也会有所帮助。当我测试它时,我想将它设置为每十五分钟左右运行一次。


编辑
EXEC dbo.sp_add_job @job_name=N'test' 返回错误
找不到存储过程“dbo.sp_add_job”。

【问题讨论】:

  • 以下编辑:尝试 EXEC msdb.dbo.sp_add_job @job_name=N'test'
  • 对对象“sp_add_job”、数据库“msdb”、模式“dbo”的执行权限被拒绝。我会尝试强制自己获得权限

标签: sql command-line transactions sql-server-agent agent


【解决方案1】:

首先,您需要确定 SQL Server 是否为 Express 版,因为 SQL Express 没有 SQL 代理功能。

在您的命令窗口中,运行以下命令:

SELECT @@version

结果将包括版本信息。

如果您有 Express,您将需要找到另一种方式来运行您的命令 - 可能使用 SQLCMD 和 Windows 调度程序,或者 SQL Express 中 SQL 代理的几个第三方替代品之一 - 如果您使用 Google 搜索“ sql express agent”,你会发现几个。我对他们没有经验,所以我不能推荐一个。

如果您有标准版或企业版,可以找到通过 T-SQL 创建 SQL 代理作业的步骤here

【讨论】:

  • CheeseWithCheese 也可以编写一个小的 Windows Script Host 脚本来执行这个操作 - VBScript 支持 ADO - 然后使用 Windows 来调度这个脚本。
  • Microsoft SQL Server 2005 - 9.00.4035.00 (X64) Nov 24 2008 16:17:31 版权所有 (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 5.2 (Build 3790) : 服务包 2)
  • 我会寻找其他方向......关于那个 msdn 网站的东西真的让我不兴奋
  • 我认为他们删除了该存储过程.....找不到存储过程'dbo.sp_add_job'。使用命令:EXEC dbo.sp_add_job @job_name=N'test'
  • 你需要在msdb数据库中运行作业创建sps,或者用三部分语法引用它们-msdb.dbo.sp_add_job。
【解决方案2】:

如果您需要在 SQL Server Agent 中创建 SQL 作业(假设您有权限),则必须创建以下内容:

1) 工作本身 2)作业中运行SQL代码的步骤 3) 运行它的时间表。

执行此操作需要以下存储过程(工作示例):

BEGIN TRY
    BEGIN TRAN

    DECLARE @jobId BINARY(16)

    --Add job
    EXEC msdb.dbo.sp_add_job @job_name=N'Job Name', @job_id = @jobId OUTPUT

    --Add step to job
    EXEC msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Do SQL Stuff', 
            @step_id=1, 
            @subsystem=N'TSQL', 
            @command=N'SELECT ''Hello, I am a query'';', 
            @database_name=N'DB_Name', 
            @flags=0

    --Add schedule to job
    EXEC msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Mon-Fri 6:00AM to 7:00PM, every hour', 
            @freq_type=8, 
            @freq_interval=62, 
            @freq_subday_type=8, 
            @freq_subday_interval=1, 
            @freq_relative_interval=0, 
            @freq_recurrence_factor=1, 
            @active_start_date=20090403, 
            @active_end_date=99991231, 
            @active_start_time=60000, 
            @active_end_time=190000

    COMMIT TRAN
END TRY
BEGIN CATCH
    SELECT ERROR_Message(), ERROR_Line();
    ROLLBACK TRAN
END CATCH

至于存储过程本身,您需要在此处查看语法:

sp_add_job

sp_add_jobstep

sp_add_jobschedule

这有点棘手,但这应该能让你继续前进。

【讨论】:

  • 您可能可以通过在它们上使用该代码块来解决它
  • 您还需要在此之后添加一个作业服务器 - 请参阅下面 Ed 的答案以获取链接。
猜你喜欢
  • 2016-02-05
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2012-05-20
  • 2011-09-10
  • 1970-01-01
相关资源
最近更新 更多