nordyck Ответов: 1

Цикл Sql server через каждую запись и редактирование


Как написать SQL-код, эквивалентный коду vba (ниже). Заранее спасибо за любую помощь в этом вопросе. Я не очень много занимался кодированием SQL.

Я написал этот код в MS Access для редактирования записей в одной таблице. Два набора записей используются для проверки наличия изменений в значениях J_CaseNum или J_Index.

Для каждой комбинации J_PersonIndex должен быть увеличен, начиная с 1. Там может быть от 1 до 70 человек для данной комбинации, 160 000 записей в таблице.

После запуска кода результаты должны выглядеть следующим образом:

CaseNum    Index  Name   PersonIndex
1001       001    Allen  01
1001       001    Brown  02
1001       001    Smith  03
1001       002    Alfred 01
1002       001    Billy  01
1002       001    Lima   02


Вот код VBA
sql = "Select J_CaseNum, J_Index, J_VehicleIndex, J_PersonIndex, J_CaseNo, J_PersonID, Ind_Last_NM  from dbo_DCIPS Order By J_CaseNum, J_Index, Ind_Last_NM"
Set rs = CurrentDb.OpenRecordset(sql)
Set rs1 = CurrentDb.OpenRecordset(sql)

rs.MoveLast
rs.MoveFirst
i = 0

While Not rs.EOF
    If i = 0 Then
        rs.Edit
        rs!J_PersonIndex = "01"
        rs!J_CaseNo = rs!J_CaseNum & rs!J_Index
        rs!J_PersonID = rs!J_CaseNo & rs!J_VehicleIndex & rs!J_PersonIndex
        rs.Update
        j = 1
        i = 1
        rs.MoveNext
    Else
        If (rs1!J_CaseNum = rs!J_CaseNum) And (rs1!J_Index = rs!J_Index) Then
            j = j + 1
            s = j
            rs.Edit
            rs!J_PersonIndex = Right("00" + s, 2)
            rs!J_CaseNo = rs!J_CaseNum & rs!J_Index
            rs!J_PersonID = rs!J_CaseNo & rs!J_VehicleIndex & rs!J_PersonIndex
            rs.Update
            rs.MoveNext
            rs1.MoveNext
        Else
            j = 1
            s = j
            rs.Edit
            rs!J_PersonIndex = Right("00" + s, 2)
            rs!J_CaseNo = rs!J_CaseNum & rs!J_Index
            rs!J_PersonID = rs!J_CaseNo & rs!J_VehicleIndex & rs!J_PersonIndex
            rs.Update
            rs.MoveNext
            rs1.MoveNext
        End If
    End If
    i = i + 1
Wend


Что я уже пробовал:

Код VBA работает нормально, потребовалось 7 часов, чтобы закончить.

1 Ответов

Рейтинг:
10

Narud Shiro

Поскольку у меня нет структуры таблицы и нет данных для тестирования, я не совсем уверен в результате. Но это должно сработать, если у вас есть хотя бы SQL Server 2005 в качестве СУБД.

WITH CTE_DCIPS
AS (
SELECT ROW_NUMBER() OVER(PARTITION BY J_CaseNum, J_Index ORDER BY Ind_Last_NM) RowNum 
    , J_CaseNum
    , J_Index
    , J_VehicleIndex
    , J_PersonIndex
    , J_CaseNo
    , J_PersonID
    , Ind_Last_NM  
FROM dbo_DCIPS 
)

UPDATE tbl
SET tbl.J_PersonIndex = RIGHT('00' + CONVERT(varchar(5), cte.RowNum), 2)
    , tbl.J_CaseNo = tbl.J_CaseNum + tbl.J_Index
    , tbl.J_PersonID = tbl.J_CaseNo + tbl.J_VehicleIndex + RIGHT('00' + CONVERT(varchar(5), cte.RowNum), 2)
FROM dbo_DCIPS tbl 
INNER JOIN CTE_DCIPS cte
ON tbl.J_CaseNum = cte.J_CaseNum AND tbl.J_Index = cte.J_Index


Maciej Los

Выглядит идеально!
5ед!