我们每天都有凌晨的SQL工作。这项工作每天运行不同的小时数。所以我需要一个可以运行的VBScript来检查作业当前是否正在运行。我有一个SQL查询来做它但是每当我在VBScript中使用它时它什么都不返回,但是当我在SQL中使用它时它完美地运行并告诉我它仍在运行。我已经用SQL查询编写了许多其他的VBScripts,它们都运行得很好。
USE msdb
SELECT
job.name AS [Job Name],
activity.run_requested_date AS [Run Date And Time],
DATEDIFF( SECOND, activity.run_requested_date, GETDATE() ) AS [Elapsed]
FROM sysjobs_view job WITH (NOLOCK)
LEFT JOIN sysjobactivity activity ON job.job_id = activity.job_id
LEFT JOIN syssessions sess ON sess.session_id = activity.session_id
LEFT JOIN (SELECT MAX( agent_start_date ) AS max_agent_start_date FROM syssessions WITH (NOLOCK)) sess_max
ON sess.agent_start_date = sess_max.max_agent_start_date
WHERE run_requested_date IS NOT NULL AND stop_execution_date IS NULL
我对SQL知之甚少,但我认为这个查询是针对视图而不是表。我甚至不知道视图和表之间的区别。 VBScript可以查询视图吗?
修改 我找到了另一个SQL查询,它给了我我想要的东西。
SELECT sysjobs.name, sysjobactivity.run_requested_date
FROM sysjobactivity WITH (NOLOCK)
INNER JOIN sysjobs ON sysjobactivity.job_id = sysjobs.job_id
WHERE sysjobactivity.start_execution_date IS NOT NULL AND sysjobactivity.stop_execution_date IS NULL
但现在我得到了一个不同的错误,这对我来说毫无意义。 VBScript代码:
strSQLQuery = ""
strSQLQuery = strSQLQuery = "SELECT sysjobs.name, sysjobactivity.run_requested_date"
strSQLQuery = strSQLQuery = " FROM sysjobactivity WITH (NOLOCK)"
strSQLQuery = strSQLQuery = " INNER JOIN sysjobs ON sysjobactivity.job_id = sysjobs.job_id"
strSQLQuery = strSQLQuery = " WHERE sysjobactivity.start_execution_date IS NOT NULL AND sysjobactivity.stop_execution_date IS NULL"
' SQL connection string
strSQLConn = "Driver={SQL Server};" & _
"Server=10.144.175.142;" & _
"Address=10.144.175.142,1433;" & _
"Database=msdb;" & _
"UID=username;" & _
"PWD=password;"
' Create database connection object
Set objConn = CreateObject( "ADODB.Connection" )
' Connection properties
objConn.ConnectionTimeout = 800
objConn.CommandTimeout = 800
objConn.Provider = "SQLOLEDB"
' Open Connection to Database
objConn.Open strSQLConn
' Clear variables
strSQLConn = Empty
' Run the SQL query
Set objRS = objConn.Execute( strSQLQuery )
' Clear variables
strSQLQuery = Empty
' Check if any data was returned
If Not objRS.EOF Then
MsgBox objRS.Fields( "name" ).Value
Else
MsgBox "Not Running"
End If
我现在得到的错误是第30行“0”附近的语法不正确。第30行是:
Set objRS = objConn.Execute( strSQLQuery )
所以,对我来说这意味着SQL查询有问题但它在SQL本身运行得非常好。
答案 0 :(得分:1)
当您在VB中执行时,不应在查询中使用USE msdb
:
1)在连接字符串中将msdb
设置为默认数据库
2)在您选择的使用全名如:
msdb..sysjobs_view
代替sysjobs_view
编辑:
连接字符串时也会出错:
strSQLQuery = strSQLQuery = "SELECT sysjobs.name, sysjobactivity.run_requested_date"
应该
strSQLQuery = strSQLQuery & "SELECT sysjobs.name, sysjobactivity.run_requested_date"
否则,您将只获得查询的最后一部分并在执行期间获得语法错误。
答案 1 :(得分:0)
感谢用户lad2025,我发现了问题。我的第二个代码/ SQL查询可以解决问题。我只是语法错误。
另外,从VBScript读取视图时似乎存在问题。
无论如何,解决方案是我使用以下内容:
strSQLQuery = strSQLQuery = "..."
应该是:
strSQLQuery = strSQLQuery & "..."