all groups > sql server dts > october 2006 >
You're in the

sql server dts

group:

DTS Activex ADODB.Recordset Do...Loop and UPDATE via SP is very slow


DTS Activex ADODB.Recordset Do...Loop and UPDATE via SP is very slow david.a.karpiak NO[at]SPAM kp.org
10/6/2006 12:44:28 PM
sql server dts:
Hello...I'm trying to update a field in a SQL 2000 table with a value
that is extracted from another field within the same table based on a
specific field value ([rectype] value). This value is dependant on a
[rectype] value = 20. All the records in the table that have a
[rectype] of 20 will determine the field value that will be populated.
The code opens a recordset uses ADODB.Connection and ADODB.recordset in
a DTS package Activex Script and loops through the table and updates
the LINKID field based upon what it finds.... This code runs very
slow... is there any possible way to speed this up? I have used a SP
to update the table to make things faster and I'm trying to figure out
an even faster way to do this... Any help is much appreciated. I have
pasted the code from the Activex Task and the SP below...

Activex Task code:
'--------------------------------------------------------------
Function Main()
dim countr
dim mySourceConn
dim mySourceRecordset
dim mySQLCmdText
dim RecNumber
dim RecType
dim TotalRecs
dim TrmPreFx
dim LINKIDstr
Dim oCmd


'------Connection to SQL that is used by all recordsets below

set mySourceConn=CreateObject("ADODB.Connection")
mySourceConn.Open="Provider=SQLOLEDB;Trusted_Connection=yes;SERVER=CSPARPSQL001;Initial
Catalog=ADRS"
'mySourceConn.Open="Provider=SQLOLEDB;Description=CSPARPSQL001;DATABASE=ADRS;Trusted_Connection=Yes"


'------Assign each group a unique identifier to associate the detail
records with the header record.

set mySourceRecordset=CreateObject("ADODB.Recordset")
mySQLCmdText= "SELECT IN_Global.* FROM IN_Global ORDER BY RecNum"
mySourceRecordset.open mySQLCmdText, mySourceConn

Set oCmd = CreateObject("ADODB.Command")
oCmd.ActiveConnection = mySourceConn
oCmd.CommandText = "usp_UpdateLINKID"
oCmd.CommandType = 4

countr = 1
mySourceRecordset.movefirst

Do Until mySourceRecordset.Fields("RecType").value = "20"
mySourceRecordset.MoveNext
Loop

Do While Not mySourceRecordset.EOF

TrmPreFx = MID(mySourceRecordset.Fields("RecDetail").value, 34, 5)
LINKIDstr = "G" & TrmPreFx &
MID(mySourceRecordset.Fields("RecDetail").value, 55, 11)

Do
'-----Call the SP
oCmd.Parameters(1) = cstr(LINKIDstr)
oCmd.Parameters(2) = mySourceRecordset.Fields("RecNum").value
oCmd.Execute
mySourceRecordset.MoveNext
If mysourceRecordset.EOF Then Exit Do
Loop Until mySourceRecordset.Fields("RecType").value = "20"

Loop

mySourceRecordset.close
mySourceConn.close
Main = DTSTaskExecResult_Success

End Function


Stored Proc CODE
'----------------------------------------------------------
CREATE PROCEDURE usp_UpdateLINKID
(
@LINKID as varchar(17),
@RecNum as varchar(15)
)
AS
UPDATE IN_Global SET LINKID = @LINKID WHERE RecNum = @RecNum
GO
RE: DTS Activex ADODB.Recordset Do...Loop and UPDATE via SP is very sl Charles Kangai
10/7/2006 10:33:01 AM
You don't need to do any of this recordset stuff. A single SQL UPDATE
statement is required to perform the update you want, something like:

update IN_Global
SET LINKID = 'G' + SUBSTRING(b.RecDetail, 34, 5) + SUBSTRING(b.RecDetail,
55, 11)
FROM IN_Global as a INNER JOIN IN_Global as b ON a.RecNum = b.RecNum WHERE
a.RecType = '20'

This should take a few seconds to execute.

Hope this helps,

Charles Kangai, MCT, MCDBA
Author of Learning Tree's 4-day course: "SQL Server 2005 Integration
Services" http://www.learningtree.com/courses/134.htm
Author of Learning Tree's 4-day course: "SQL Server Reporting Services"
http://www.learningtree.com/courses/523.htm
email: charles at kangai.demon.co.uk



[quoted text, click to view]
AddThis Social Bookmark Button