Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将VBA函数移动到SQL Server存储过程_Sql Server_Vba_Tsql_Stored Procedures_Ado - Fatal编程技术网

Sql server 将VBA函数移动到SQL Server存储过程

Sql server 将VBA函数移动到SQL Server存储过程,sql-server,vba,tsql,stored-procedures,ado,Sql Server,Vba,Tsql,Stored Procedures,Ado,我在MS Access中运行了一些VBA代码,我想将其“升迁”为存储过程。它现在使用ADO来生成排名(荷兰语为PLAATS),但我必须在SQL Server上完成这项工作。谁能帮忙 VBA中的代码是: Function InvullenUitslag() Dim MijnDb As Database Dim rsWEDS As Recordset Dim iCategorie As Integer Dim iPlaats As Integer Dim i

我在MS Access中运行了一些VBA代码,我想将其“升迁”为存储过程。它现在使用ADO来生成排名(荷兰语为PLAATS),但我必须在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
函数InvullenUitslag()
Dim MijnDb As数据库
Dim rsWEDS作为记录集
作为整数的Dim-egorie
作为整数的Dim iPlaats
Dim iExequo作为整数
Dim dblTotaal为双精度
作为字节的Dim IAANTALDELNEMERS
设置MijnDb=DBEngine.Workspaces(0).数据库(0)
Set rsWEDS=MijnDb.OpenRecordset(“Q_uitland”)
我们先走一步
如果不是rsWEDS.EOF,则
iCategorie=rsWEDS![分类ID]
dblTotaal=-1
iPlaats=0
iExequo=0
IAANTALDELNEMERS=0
如果结束
而不是rsWEDS.EOF()
如果不是(iCategorie=rsWEDS![categoried]),则
iPlaats=1
iExequo=0
IAANTALDELNEMERS=1
其他的
如果Abs(dbltoal-rsWEDS![iTOTAAL])为0,则
欢迎光临![EXEQUO]=“*”
如果结束
rsWEDS.Update
iCategorie=rsWEDS![分类ID]
dblTotaal=rsWEDS![伊托塔尔]
rsWEDS.MoveNext
温德
端函数

如果我理解正确,您希望根据总分和拆分(按级别划分)对参与者进行排名

我认为需要使用带有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

首先。。。此数据是否在SQL Server中
DBEngine.workspace(0).Databases(0)
通常指的是Access数据库,而不是SQL Server。数据在Access数据库中,我正在将其移动到SQL Server。我是这个matterI的初学者,我想您的第一步是将它导入SQL Server。你能解释一下VBA是如何处理数据样本的吗?看起来可能是分区类型的查询。它将进入哪个版本的SQL Server?我使用它来对体操比赛的成绩进行排名。表中有名称和仪器结果。根据总分,我需要设定一个排名。我用它来对体操比赛的成绩进行排名。表中有名称和仪器结果。根据总分,我需要设置一个排名。该表类似于名称、级别、结果参数1、结果参数2、总分示例:Jimm、级别A、8.0、9.0、17.0 Jack、级别A、级别7.2、8.4、15,6 John、级别B、8.2、7.6、15,6我需要根据每个级别的总分设置排名。它包括一项检查,当两个人的总数相同时,他们获得相同的排名,下一个跳过一个位置,如位置1、位置2、位置2、位置4