标签: sql-server-agent

正在运行的 SQL 作业 - 如何终止

我运行了下面的查询,它显示了当前正在运行的作业的列表。然而,在活动监视器中,这些都没有运行。我如何验证这些是否正在运行?

我该如何杀死他们?

    select sj.name
    ,sja.*
from msdb.dbo.sysjobactivity as sja
inner join msdb.dbo.sysjobs as sj on sja.job_id = sj.job_id
where sja.start_execution_date is not null
and sja.stop_execution_date is null
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

sql-server sql-server-agent jobs

4
推荐指数
1
解决办法
4万
查看次数

自动 SP_WhoIsActive SQL 活动捕获问题

我在生产服务器上有一个 SQL 代理作业,它不断失败并显示以下消息。它应该使用SP_WHOISACTIVE存储的 proc 以定期安排的时间间隔捕获 SQL Server 活动。

以用户身份执行:警告:聚合或其他 SET 操作消除了空值。[SQLSTATE 01003](消息 8153)

警告:空值被聚合或其他 SET 操作消除。[SQLSTATE 01003](消息 8153)

警告:空值被聚合或其他 SET 操作消除。[SQLSTATE 01003](消息 8153)

违反 PRIMARY KEY 约束“PK_WhoIsActive”。无法在对象“monitoring.WhoIsActive”中插入重复键。重复的键值为 (Jan 20 2017 8:25AM, 109)。[SQLSTATE 23000](错误 2627)

该语句已终止。[SQLSTATE 01000](错误 3621)。

步骤失败。

知道是什么原因造成的吗?

我应该遵循哪些步骤来修复此错误?

sql-server sql-server-2008-r2 sql-server-agent jobs sp-whoisactive

4
推荐指数
2
解决办法
4751
查看次数

执行Sql语句并将结果发送到电子邮件

我必须每天执行 SQL 语句并将结果通过电子邮件发送给 dba。我配置了数据库电子邮件。

下面是查询:

 SELECT
        account.accountID,
        account.name
    FROM
        account
        LEFT OUTER JOIN accountfeaturesetting afs 
            ON afs.accountid = account.accountid 
                and afs.featureid = 'Schedules' 
                and afs.settingid = 'EditReasons'
    WHERE
        ISNULL(afs.Value, '0') = '1'
        AND NOT EXISTS
 (SELECT 1 FROM program 
WHERE program.AccountID = account.AccountID
 AND program.Active = 1 AND 
(program.ScheduleEditReasonFlags <> 0 OR
 program.ScheduleEditReasonFields <> 0))
        AND account.IsMaster = 0
Run Code Online (Sandbox Code Playgroud)

为此,我创建了具有 2 个步骤的 Sql 作业:

  1. 执行选择语句
  2. 发送结果:

    Use MSDB
        EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'abc',
            @recipients = 'recipients@company.com',
            @subject = 'queryresultset',
            @body='testmail', …
    Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-agent database-mail

4
推荐指数
2
解决办法
7万
查看次数

从另一个 SQL 服务器实例启动作业

我在 SQL 2008 服务器(服务器 A)上有一份工作(我知道这并不理想……正在解决这个问题)。代理在 NT AUTHORITY\NETWORK SERVICE 下运行。

我想添加一个运行位于另一台 SQL 2014 服务器(服务器 B)上的作业的步骤。

我会用:

EXEC [Server B].msdb..sp_start_job N'JobName'
Run Code Online (Sandbox Code Playgroud)

从服务器 A 手动运行它按预期在服务器 B 上执行作业。

如果我将任务添加到服务器 A 上的作业,它会失败并显示以下消息:

以用户身份执行:NT AUTHORITY\NETWORK SERVICE。对象“sp_start_job”、数据库“msdb”、架构“dbo”上的 EXECUTE 权限被拒绝。[SQLSTATE 42000](错误 229)。步骤失败。

我已将服务器 B 上的 NT AUTHORITY\NETWORK SERVICE 分配给 msdb 中的“TargetServerRole”,然后授予有关用户 SP_Start_Job 和 SP_Stop_Job 的执行权限。

服务器 A 将服务器 B 作为链接服务器,我尝试设置“本地服务器登录到远程服务器登录映射”本地登录 NT AUTHORITY\NETWORK SERVICE 来模拟。

作业仍然失败并出现相同的错误。

我需要做什么?

谢谢

sql-server-2008 sql-server permissions sql-server-agent jobs

4
推荐指数
2
解决办法
1537
查看次数

如何从 SQL 作业运行 SQL Server 漏洞评估?

我想从 SQL Server 代理作业运行 SQL Server 漏洞评估。目前,我正在尝试使用 PowerShell 脚本完成一项工作,并且正在运行如下所示的命令。

Invoke-SqlVulnerabilityAssessmentScan -ServerInstance $(ESCAPE_DQUOTE(SRVR)) -Database AdventureWorks
Run Code Online (Sandbox Code Playgroud)

我已经确认 Invoke-SqlVulnerabilityAssessmentScan 在 SQL Server 上可用(我可以从那里的 PowerShell 命令提示符运行它),但是当我运行我的作业时,我收到一条错误消息,指出

术语“Invoke-SqlVulnerabilityAssessmentScan”未被识别为 cmdlet 的名称

看完这篇 Microsoft 文章后,我想知道 SQL Agent 是否只有它可以访问的 PowerShell cmdlet 的一个子集。

如何从 SQL 作业运行漏洞评估扫描?

sql-server sql-server-agent vulnerability-assessment

4
推荐指数
2
解决办法
562
查看次数

为什么作业的 next_run_time 是错误的?

我有一个关于工作统计的问题。因此,我有一份具有以下时间表的工作:每天在上午 12:00:00 到晚上 11:59:59 之间每 5 分钟发生一次。时间表将于 2017 年 12 月 13 日开始使用。

在 2019-10-20 上午 11:27 我运行了两个脚本来获取 last_run_time 和 next_run_time,下面是脚本及其对应的结果:

USE msdb
GO
SELECT J.Name                     AS 'Job Name'
         ,'Job Enabled' =        
          CASE J.Enabled
                 WHEN 1 THEN 'Yes'
                 WHEN 0 THEN 'No'
          END
         ,STUFF(
          STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-')
          , 8, 0, '-')                   AS 'Job Schedule Start Date'
         ,STUFF(
          STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-')
          , 8, 0, '-')                   AS 'Job Schedule End Date'
         ,'Job Frequency' =
          CASE …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-agent jobs scheduled-tasks sql-server-2014

4
推荐指数
1
解决办法
606
查看次数

更改 SQL 代理操作符的字符限制

我想向 SQL 代理操作员警报添加超过 100 个字符的电子邮件地址。

例如: emaione@example.com;emailtwo@example.com;emailthree@example.com;....

我试图通过改变 sysoperators email_address 列来绕过 100 个字符的限制

ALTER TABLE sysoperators
ALTER column email_address NVARCHAR(1000);
Run Code Online (Sandbox Code Playgroud)

然后创建我的运算符,但地址仍然被截断为 100 个字符?

sql-server sql-server-agent alerts operator

4
推荐指数
1
解决办法
1067
查看次数

通过 SQL Server 代理抑制 SQLCMD 输出中的 SQL Server Management Studio 的“消息”

我创建了一个以 XML 格式输出数据的脚本,并使用 SQL Server 代理(“操作系统 (cmdexec)”类型的作业步骤)每月/每季度运行一项作业,以将数据输出到特定文件。然而,我们遇到的问题是 SQLCMD 脚本的输出:

sqlcmd -d <Database> -i "<Package>\<SQLFile>.sql" -o "<OutputFilePath>\<FileName>.xml" -y 0

正在输出“消息”和“结果”。有没有办法只通过sqlcmd写入结果?

我删除了一些消息,包括:

“警告:空值会被聚合或其他 SET 操作消除。”

“(受影响的 1 行)”

通过使用以下代码:

SET NOCOUNT ON
SET ANSI_WARNINGS OFF
GO
Run Code Online (Sandbox Code Playgroud)

感谢您的建议!

sql-server sqlcmd sql-server-agent

4
推荐指数
1
解决办法
928
查看次数

当我从 SQL Server 作业运行此查询时,为什么它会失败?

我知道如何解决这个问题,但我不明白为什么当我从SSMS运行下面的查询时它会起作用的技术细节运行下面的查询时它可以工作,但当我将它添加为 SQL Server 代理中的作业时相同的查询会失败,这背后的技术细节是什么。

查询:

select LEFT(datediff(day,GETDATE(),'31/08/20'+'26')/365.25,2) AS test
Run Code Online (Sandbox Code Playgroud)

作业失败时我收到的错误:

从字符串转换日期和/或时间时转换失败。[SQLSTATE 22007](错误 241)。这一步失败了。

SQL 代理是否使用不同的引擎或不同的技术?

sql-server sql-server-agent jobs errors date

4
推荐指数
2
解决办法
1250
查看次数

SQL Server 代理 - 在每个月末使用日期变量运行查询

我正在运行 SQL Server 2008 R2,我需要创建一个新作业,该作业基本上会在每个月初(每个月 1 日上午 01:00)运行查询。

这是查询:

INSERT INTO [SupportTracker].[dbo].[DashboardRecords]
SELECT [bg_id]
      ,[bg_short_desc]
      ,[bg_reported_date]
      ,[bg_status_updated_date]
      ,[us_firstname]
      ,[us_lastname]
      ,[LastUpdatedUserFirstname]
      ,[LastUpdatedUserLastname]
      ,[st_name]
      ,[pr_name]
      ,[ct_name]
      ,[pj_name]
      ,[AssignedUserFirstname]
      ,[AssignedUserLastname]
      ,[bg_project]
      ,[no_of_hours]
      ,[BugType]
      ,[SubType]
      ,[Device]
      ,[pj_parent_id]
FROM [SupportTracker].[dbo].[ViewIssueListwBugTypeNDevice]
WHERE 
     bg_reported_date between '2012-12-01 00:00:00.000' AND '2012-12-31 23:59:59.999' 
     AND bg_id NOT IN (SELECT bg_id FROM [SupportTracker].[dbo].[DashboardRecords])
ORDER BY bg_reported_date ASC
Run Code Online (Sandbox Code Playgroud)

我的问题是在WHERE条款上。这两个日期每个月都必须更改。

  • 如果我们在01-01-2013 01:00:00:00,我需要这两个日期:
    2012-12-01 00:00:00.0002012-12-31 23:59:59.999

  • 如果我们在01-02-2013 01:00:00:00,我需要这两个日期是:
    2013-01-01 00:00:00.0002013-01-31 23:59:59.999

基本上我需要捕获数据库的一部分并将其保存在表中,就像每个月末一样......

谢谢

sql-server sql-server-2008-r2 sql-server-agent

3
推荐指数
2
解决办法
6226
查看次数