2015-04-07 51 views
0

我有一些VBA代码在MS Access中运行,我想“升迁”到存储过程。它现在使用ADO来生成排名(荷兰语中的PLAATS),但我必须在SQL Server上完成这项工作。谁可以帮忙?将VBA函数移动到SQL Server存储过程

在VBA代码是:

Function InvullenUitslag() 

    Dim MijnDb As Database 
    Dim rsWEDS As Recordset 
    Dim iCategorie As Integer 
    Dim iPlaats As Integer 
    Dim iExequo As Integer 
    Dim dblTotaal As Double 
    Dim iAantalDeelnemers As Byte 

    Set MijnDb = DBEngine.Workspaces(0).Databases(0) 
    Set rsWEDS = MijnDb.OpenRecordset("Q_UITSLAG") 

    rsWEDS.MoveFirst 

    If Not rsWEDS.EOF Then 
     iCategorie = rsWEDS![CATEGORIEID] 
     dblTotaal = -1 
     iPlaats = 0 
     iExequo = 0 
     iAantalDeelnemers = 0 
    End If 

    While Not rsWEDS.EOF() 
     If Not (iCategorie = rsWEDS![CATEGORIEID]) Then 
      iPlaats = 1 
      iExequo = 0 
      iAantalDeelnemers = 1 
     Else 
      If Abs(dblTotaal - rsWEDS![iTOTAAL]) <= 0.0001 Then 
       iExequo = iExequo + 1 
       iAantalDeelnemers = iAantalDeelnemers + 1 
      Else 
       iPlaats = iPlaats + iExequo + 1 
       iExequo = 0 
       iAantalDeelnemers = iAantalDeelnemers + 1 
      End If 
     End If 

     rsWEDS.Edit 
     rsWEDS![PLAATS] = iPlaats 
     rsWEDS![AANTALDEELNEMERS] = iAantalDeelnemers 

     If iExequo > 0 Then 
      rsWEDS![EXEQUO] = "*" 
     End If 

     rsWEDS.Update 
     iCategorie = rsWEDS![CATEGORIEID] 
     dblTotaal = rsWEDS![iTOTAAL] 
     rsWEDS.MoveNext 
    Wend 

End Function 
+0

对于初学者...这是数据在SQL Server? 'DBEngine.Workspaces(0).Databases(0)'通常是指Access数据库,而不是SQL Server –

+0

数据在Access数据库中,我将它移动到SQL Server。我是这件事的先行者 – Jan

+0

我想你的第一步是把它放到SQL Server中。你能解释一下VBA在数据样本中的作用吗?它看起来可能是分区类型查询。它将进入哪个版本的SQL Server? –

回答

0

如果我理解正确的话,你想设置基于totalscore和拆分(由分区)级别的参加者的排名。

我认为你需要使用PARTITION BY子句的RANK()。您的结果将是这个样子:

declare @table table (
    Name nvarchar(50) 
    ,[Level] nvarchar(1) 
    ,ResultApparatus1 decimal(12,1) 
    ,ResultApparatus2 decimal(12,1) 
    ,TotalScore decimal(12,1) 
) 

insert into @table values ('Jimm','A',8.0,9.0,17.0) 
insert into @table values ('Jack','A',7.2,8.4,15.6) 
insert into @table values ('John','B',8.2,7.6,15.6) 
insert into @table values ('Frank','B',8.2,7.6,15.6) 
insert into @table values ('Mark','B',8.2,7.8,15.8) 

select 
    * 
    ,RANK() OVER (PARTITION BY [Level] ORDER BY [Level], TotalScore DESC) Position 
from 
    @table 

这将返回结果集如下:

Name Level ResultApparatus1 ResultApparatus2 TotalScore Position 
Jimm A  8.0     9.0     17.0  1 
Jack A  7.2     8.4     15.6  2 
Mark B  8.2     7.8     15.8  1 
John B  8.2     7.6     15.6  2 
Frank B  8.2     7.6     15.6  2