Richard
asked on
SQLSERVERAGENT JOB DOES NOT TERMINATE WITH DTS TASK WORKFLOW SCRIPT
I have had an sql 2000 database running on several servers no problem. Recently setup the same system on MSDE 2000 Windows 2003 server and for some reason the sqlserveragent job that updates the database does not terminate. After some testing it appears to occur whenever I have the workflow activex script enabled in the initial task of the dts job. The script checks if new copies of the flat files have been generated before allowing the job to run. If I disable this activex workflow script and schedule the job the job will terminate normally.
The reason for the script is the flat files that I am importing to the database are generated from several sources and the timing is uncertain. So I schedule the job to run every hour with the workflow script preventing the job from running any of the tasks unless a complete new set of flat files are ready.
The sqlserveragent does log an error "Unable to read local eventlog (reason: The data area passed to a system call is too small)" each time the job runs. Don't see this error on any of the sql 2000 servers.
One peculiar thing is that I log to the db the progress of key steps in the dts jobs with the last step of the job logging the job is complete... these entries indicate that all steps have completed. All the tables have been updated.
I tried logging onto the server with the same credentials as the sqlserveragent... exec each step in the job manually and verifying the sqlserveragent error log each time.... looking for the step that may be generating the error. No error was generated. But if I execute the dts package as a whole it generates the error but terminates normally.
Any suggestions....
Code from the workflow script
'************************* ********** ********** ********** ********** *****
' Visual Basic ActiveX Script
'************************* ********** ********** ********** ********** *******
Function Main()
dim sCatalog , sDataSource
sCatalog = DTSGlobalVariables("gvCata log").Valu e
sDataSource = DTSGlobalVariables("gvData Source").V alue
Dim con, rs, rsFiles, rsLastUpdate, conString, XtractReadyFlg
Set con = CreateObject("ADODB.Connec tion")
conString = "Provider=SQLOLEDB.1;Integ rated Security=SSPI;"
conString = conString & "Persist Security Info=False;Initial Catalog=" & sCatalog &";Data Source=" & sDataSource
con.Open conString
XtractReadyFlg = 0
Set rsLastUpdate = con.Execute("SELECT MAX(CONVERT(char, ImportDate, 1)) AS LastDTS FROM dbo.tbl_process_status WHERE (Status = N'DTS Job Started')")
If Not rsLastUpdate.EOF Then
If DateDiff("d", rsLastUpdate.Fields("LastD TS").Value , Date) > 0 Then
Dim FileDate, OldFileDate, sFilePathName
Dim fso, objFile
Set fso = CreateObject("Scripting.Fi leSystemOb ject")
Set rs = CreateObject("ADODB.Record set")
Set rsFiles = CreateObject("ADODB.Record set")
Set rsFiles = con.Execute("SELECT FileName, ExportDir, LdFileStr FROM dbo.tbl_Eval_SAP_FTP")
If Not rsFiles.EOF Then
rsFiles.MoveFirst
Do
Set rs = con.Execute("SELECT TOP 1 FileDate FROM dbo.tbl_process_status WHERE (Status LIKE N'" & rsFiles.Fields("LdFileStr" ).Value & "') ORDER BY FileDate DESC")
If Not rs.EOF Then OldFileDate = rs.Fields("FileDate").Valu e
sFilePathName = (rsFiles.Fields("ExportDir ").Value & rsFiles.Fields("FileName") .Value)
If fso.FileExists(sFilePathNa me) Then
Set objFile = fso.GetFile(sFilePathName)
FileDate = objFile.DateLastModified
End If
'MsgBox sFilePathName & " " & OldFileDate & " " & FileDate
'MsgBox DateDiff("N", OldFileDate, FileDate)
If DateDiff("N", OldFileDate, FileDate) <= 0 Then
XtractReadyFlg = 0
Exit Do
Else
XtractReadyFlg = 1
End If
rsFiles.MoveNext
Loop Until rsFiles.EOF
End If
'MsgBox XtractReadyFlg
Set fso = Nothing
Set objFile = Nothing
rs.Close
rsFiles.Close
End If
End If
rsLastUpdate.Close
Set rs = Nothing
Set rsFiles = Nothing
Set rsLastUpdate = Nothing
con.Close
Set con = Nothing
If XtractReadyFlg Then
Main = DTSStepScriptResult_Execut eTask
Else
Main = DTSStepScriptResult_DontEx ecuteTask
End If
End Function
The reason for the script is the flat files that I am importing to the database are generated from several sources and the timing is uncertain. So I schedule the job to run every hour with the workflow script preventing the job from running any of the tasks unless a complete new set of flat files are ready.
The sqlserveragent does log an error "Unable to read local eventlog (reason: The data area passed to a system call is too small)" each time the job runs. Don't see this error on any of the sql 2000 servers.
One peculiar thing is that I log to the db the progress of key steps in the dts jobs with the last step of the job logging the job is complete... these entries indicate that all steps have completed. All the tables have been updated.
I tried logging onto the server with the same credentials as the sqlserveragent... exec each step in the job manually and verifying the sqlserveragent error log each time.... looking for the step that may be generating the error. No error was generated. But if I execute the dts package as a whole it generates the error but terminates normally.
Any suggestions....
Code from the workflow script
'*************************
' Visual Basic ActiveX Script
'*************************
Function Main()
dim sCatalog , sDataSource
sCatalog = DTSGlobalVariables("gvCata
sDataSource = DTSGlobalVariables("gvData
Dim con, rs, rsFiles, rsLastUpdate, conString, XtractReadyFlg
Set con = CreateObject("ADODB.Connec
conString = "Provider=SQLOLEDB.1;Integ
conString = conString & "Persist Security Info=False;Initial Catalog=" & sCatalog &";Data Source=" & sDataSource
con.Open conString
XtractReadyFlg = 0
Set rsLastUpdate = con.Execute("SELECT MAX(CONVERT(char, ImportDate, 1)) AS LastDTS FROM dbo.tbl_process_status WHERE (Status = N'DTS Job Started')")
If Not rsLastUpdate.EOF Then
If DateDiff("d", rsLastUpdate.Fields("LastD
Dim FileDate, OldFileDate, sFilePathName
Dim fso, objFile
Set fso = CreateObject("Scripting.Fi
Set rs = CreateObject("ADODB.Record
Set rsFiles = CreateObject("ADODB.Record
Set rsFiles = con.Execute("SELECT FileName, ExportDir, LdFileStr FROM dbo.tbl_Eval_SAP_FTP")
If Not rsFiles.EOF Then
rsFiles.MoveFirst
Do
Set rs = con.Execute("SELECT TOP 1 FileDate FROM dbo.tbl_process_status WHERE (Status LIKE N'" & rsFiles.Fields("LdFileStr"
If Not rs.EOF Then OldFileDate = rs.Fields("FileDate").Valu
sFilePathName = (rsFiles.Fields("ExportDir
If fso.FileExists(sFilePathNa
Set objFile = fso.GetFile(sFilePathName)
FileDate = objFile.DateLastModified
End If
'MsgBox sFilePathName & " " & OldFileDate & " " & FileDate
'MsgBox DateDiff("N", OldFileDate, FileDate)
If DateDiff("N", OldFileDate, FileDate) <= 0 Then
XtractReadyFlg = 0
Exit Do
Else
XtractReadyFlg = 1
End If
rsFiles.MoveNext
Loop Until rsFiles.EOF
End If
'MsgBox XtractReadyFlg
Set fso = Nothing
Set objFile = Nothing
rs.Close
rsFiles.Close
End If
End If
rsLastUpdate.Close
Set rs = Nothing
Set rsFiles = Nothing
Set rsLastUpdate = Nothing
con.Close
Set con = Nothing
If XtractReadyFlg Then
Main = DTSStepScriptResult_Execut
Else
Main = DTSStepScriptResult_DontEx
End If
End Function
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.