[英]Loop in an update SQL Server query sent by MS Access vba
我使用 MS Access vba 作为接口,使用 SQL Server 作为数据库服务器。
我想更新表CANDIDAT_TESTS
中的一组行。 我现在正在做的是一个一个更新,我用一个for循环循环; 它有效,但需要太多时间。
我想通过循环一个查询来减少查询的数量。
我的代码:
This is the entire code
´´´ varSession = "2020" 设置 cnx = getConnectionBD(varSession)
rsSCE.Open "SELECT DISTINCT LIBELLE_DEPARTEMENT, LIBELLE_SOUS_CENTRE, NUM_SOUS_CENTRE " _
& " FROM VIEW_CANDIDATS_SCE " _
& " WHERE NUM_REGION = " & Me.LIST_REGION & " AND NUM_EXAMEN = " & Me.LIST_EXAMEN _
& " ORDER BY LIBELLE_DEPARTEMENT, LIBELLE_SOUS_CENTRE", cnx, adOpenStatic, adLockOptimistic
varTabSCE = rsSCE.GetRows
'On initialise les jurys parce que les jurys sont par région
jury = 0
'On parcourt les sous-centres par départements
For j = 1 To rsSCE.RecordCount
rsSerie.Open "SELECT DISTINCT NUM_SERIE, ABREVIATION_SERIE " _
& " FROM VIEW_CANDIDATS_SCE " _
& " WHERE NUM_SOUS_CENTRE = " & varTabSCE(2, j - 1) & " AND NUM_EXAMEN = " & Me.LIST_EXAMEN _
& " ORDER BY ABREVIATION_SERIE", cnx, adOpenStatic, adLockOptimistic
varTabSerie = rsSerie.GetRows
'On parcourt les séries du sce j
For k = 1 To rsSerie.RecordCount
'on initialise le curseur à 0 étant donné que les numéros d'ordre sont par série
cursor = 0
rsCandidats.Open "SELECT ID FROM CANDIDAT_TESTS " _
& " WHERE NUM_SOUS_CENTRE = " & varTabSCE(2, j - 1) & " AND NUM_SERIE = " & varTabSerie(0, k - 1) _
& " ORDER BY NOMS, DATE_DE_NAISSANCE", cnx, adOpenStatic, adLockOptimistic
varTabCandidats = rsCandidats.GetRows
nbCanddidats = rsCandidats.RecordCount
nbJurys = RoundUp(nbCanddidats / 250)
'On parcourt les jurys de la série k du sce j
numJury = nbJurys
For l = 1 To nbJurys
jury = jury + 1
If numJury > 1 Then
'On parcourt les candidats du jury l pour leur attribuer le numéro d'ordre et le jury
For m = 250 * (l - 1) + 1 To 250 * (l - 1) + 250
cursor = cursor + 1
rsUpdate.Open "UPDATE CANDIDAT_TESTS " _
& " SET NUMERO_ORDRE = " & cursor & ", JURY = " & jury _
& " WHERE ID = " & varTabCandidats(0, m - 1), cnx, adOpenStatic, adLockOptimistic
Set rsUpdate = Nothing
Next m
ElseIf numJury = 1 Then
'On parcourt les candidats du dernier jury pour leur attribuer le numéro d'ordre et le jury
For m = 250 * (l - 1) + 1 To nbCanddidats
cursor = cursor + 1
rsUpdate.Open "UPDATE CANDIDAT_TESTS " _
& " SET NUMERO_ORDRE = " & cursor & ", JURY = " & jury _
& " WHERE ID = " & varTabCandidats(0, m - 1), cnx, adOpenStatic, adLockOptimistic
Set rsUpdate = Nothing
Next m
End If
numJury = numJury - 1
Next l
Set rsCandidats = Nothing
Set rsSerie = Nothing
Next k
Set rsSCE = Nothing
Next j ´´´
有什么方法可以将 for m 循环转换为单个查询? 因为我再次循环了这段代码。
谢谢大家
与其为循环的每次迭代重复执行 SQL 语句,不如迭代单个记录集并更新遇到的每个记录的值可能更有效,例如,使用 DAO:
With CurrentDb.OpenRecordset _
( _
"select numero_ordre from candidat_tests " & _
"where id >= " & varTabCandidats(0, 250 * (l - 1)) & " and " & _
"id <= " & varTabCandidats(0, 250 * (l - 1) + 249) & " " & _
"order by id"
)
If Not .EOF Then
.MoveFirst
cursor = 1
Do Until .EOF
.Edit
!numero_ordre = cursor
.Update
.MoveNext
cursor = cursor + 1
Loop
End If
.Close
End With
在varTabCandidats
function 的情况下,上述内容显然未经测试。
这就是我所做的:
dim popjury as integer, jurynum as integer
popjury=0
jurynum=1
Do Until rsCandidats.EOF
cursor = cursor + 1
popjury=popjury+1
if popjury > 250 then
popjury=1
jurynum=jurynum+1
end if
rsCandidats.Edit
rsCandidats!NUMERO_ORDRE = cursor
rsCandidats!JURY = jurynum
rsCandidats.Update
rsCandidats.MoveNext
Loop
有用。 谢谢大家。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.