2016-12-29 105 views
0

如何在T-SQL中编写等效的SQL脚本?SQL Server脚本遍历每条记录并更新它

我已经在MS Access中编写了这段代码来编辑记录 - 我怎么能在SQL Server中做同样的事情?

对于J_CaseNumJ_Index J_PersonIndex的每个组合需要增加。对于给定的组合,可以有从1到50人的任何地方。

Dim rs As Recordset 
Dim rs1 As Recordset 
Dim i As Long 
Dim s As String 

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 
cnt = rs.RecordCount 
rs.MoveFirst 
i = 0 

SysCmd acSysCmdInitMeter, "_", cnt 

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 
    SysCmd acSysCmdUpdateMeter, i 

    If (i Mod 1000) = 0 Then Stop 
Wend 

在此先感谢

+5

什么是你的问题/什么是你遇到的麻烦现有的表? SO不是代码写入服务。 –

+0

组合可以重复吗?还是它们是唯一的?你想让J_PersonIndex成为一个静态数字,还是每次查询都会产生? –

+0

J_PersonIndex将是一个静态值。这是一次性更新。 – Draco

回答

1

确定,所以希望每个组的情况下/指数/人的计数器。我会做这样的事情来获得一个独特的人物ID。

SELECT ROW_NUMBER() OVER (partition BY caseNum,[index] order by [index])  
    AS personId , caseNum, [index], personName FROM table 

然后你可以使用这个数据集插入到一个新表或更新从该查询(这是一个修改的命令)

+0

有160,000条记录需要更新。 – Draco

+0

我是新来编写SQL代码,从来没有听说过交叉连接。这是我正在使用的一张桌子。我使用两个记录集的原因是为了测试在两列中发生更改的时间,因此我可以将personIndex重置为01,以供新组使用。 例如: CaseNum指标名称PERSONID 史密斯01 10001 001帕特02 10001 002 allice 01 10002 001史密斯01 – Draco

+1

@ user7355774 确定,所以希望每个组的情况下/指数/人的计数器。 我会做这样的事情来获得一个独特的人员ID。 '代码 SELECT ROW_NUMBER() OVER(PARTITION BY caseNum,[指数]为了通过[指数])AS PERSONID, caseNum,[指数],PERSONNAME FROM表 ' 然后可以使用此数据集从此查询插入新表或更新现有表(这是另一步) – cjr