2015-08-31 4 views
0

У нас есть ежедневная работа SQL, которая запускается ранним утром. Работа выполняется по разному количеству часов каждый день. Поэтому мне нужен VBScript, который я могу запустить, чтобы проверить, запущено ли задание или нет. У меня есть SQL-запрос для этого, но всякий раз, когда я использую его в VBScript, он ничего не возвращает, но когда я использую его в SQL, он отлично работает и говорит мне, что он все еще работает. Я написал много других VBScripts с SQL-запросами, и все они отлично работали.Проверьте, выполняется ли задание SQL с VBScript

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 

Я получаю ошибку теперь неправильный синтаксис около «0» на линии 30. Линия 30 является:

Set objRS = objConn.Execute(strSQLQuery) 

Так что для меня означает, что что-то не так с SQL но он отлично работает в самом SQL.

+0

Попробуйте установить базу MSDB по умолчанию в строке подключения и запустить ваш выбор без 'ИСПОЛЬЗОВАНИЯ msdb', или использовать полностью определенные имена, такие как 'FROM msdb..sysjobs_view ...', Возможно, это не сработает, потому что, когда вы выполняете USE msdb, он завершает выполнение и не выполняет SELECT, потому что это должно выполняться отдельными партиями. – lad2025

+0

Что происходит, когда вы пытаетесь запустить это? Кроме того, код VBScript, который вы используете для запуска SQL, также будет полезен. –

+0

Если я запускаю первый бит SQL-кода в VBScript, он ничего не возвращает. Я использую тот же метод для запуска кода, как и в приведенном коде. – user3017424

ответ

1

Вы не должны использовать USE msdb в запросе при выполнении его в VB вместо:

1) В строке подключения установите msdb в качестве базы данных по умолчанию

2) В ваших отборных использовать полные имена, как: msdb..sysjobs_view вместо sysjobs_view

EDIT:

Также у вас есть ошибка при конкатенации строки:

strSQLQuery = strSQLQuery = "SELECT sysjobs.name, sysjobactivity.run_requested_date"

Шоуда быть

strSQLQuery = strSQLQuery & "SELECT sysjobs.name, sysjobactivity.run_requested_date"

В противном случае вы получите только последнюю часть запроса и получить синтаксическую ошибку во время выполнения.

+0

1. Я обычно делаю это. 2. Я дам этому попытку. – user3017424

+0

Пробовал вариант 2, все еще указывая базу данных в строке подключения, но, увы, первый запрос SQL, который я предоставил, все еще возвращает ничего. – user3017424

+0

Запустите профайлер и посмотрите, какой запрос попадает в базу данных. – lad2025

0

Благодаря пользователю lad2025 я нашел проблему. Мой второй бит кода/SQL-запроса делает трюк. У меня просто была синтаксическая ошибка.

Отдельная заметка, кажется, возникает при чтении просмотров из VBScript.

решения Во всяком случае в том, что я использовал следующее:

strSQLQuery = strSQLQuery = "..." 

Это должно быть:

strSQLQuery = strSQLQuery & "..." 
Смежные вопросы