繁体   English   中英

VBA到SQL Link的最佳做法和性能

[英]VBA to SQL Link best practice and performance

我有以下问题。 通常,当我在VBA中使用SQL命令生成字符串时,检索结果的时间不会超过几秒钟(几个运行查询非常“繁重”)。

但是,从“ VBA”发送到SQL时,在一种“轻巧”的情况下,可能要花费几分钟。 但是,当我在SQL Server中单独运行SQL代码时,该代码将在一秒钟内运行。 因此,我认为VBA与SQL之间的连接功能存在问题吗? 我在下面列出了两个代码:

首先,我有以下代码在VBA脚本和SQL-Server之间建立连接(输入:SQL字符串;输出:SQL-Server表结果)

Private Function GetSQLData(ByVal SQLString As String)
    Dim sCon As String
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset

    sCon = "Provider = "MSDASQL.1;"
    sCon = sCon & "driver={SQL Server};"
    sCon = sCon & "Server=PCNAME\SQLEXPRESS;"
    sCon = sCon & "Database=HELLOFORUM;"
    sCon = sCon & "uid="";"
    sCon = sCon & "pwd:="";"

    '/ I create the connection to SQL Server
    Set cnn = New ADODB.Connection
    With cnn
        .Open sCon
        .CursorLocation = adUseClient
        .CommandTimeout = 0
    End With


    '/ Load results
    Set rst = New ADODB.Recordset
    With rst
        .CursorLocation = adUseServer
        .Open Source:=SQLString, ActiveConnection:=cnn, CursorType:=adOpenForwardOnly, _
        LockType:=adLockOptimistic, Options:=adCmdText
    End With

    If rst.State = 1 Then
        If Not rst.EOF Then
            GetSQLData = rst.GetRows()
        End If
    End If
End Function

我有一个数据库,如下所示:

ID   timetag              val
ID01 1990-01-01 00:00:00  20
ID01 1990-01-01 00:01:00  23
[...]

产生问题的代码如下:

WITH rows AS (
    SELECT *,Row_Number() Over (ORDER BY timetag) as RN FROM [Database.dbo]
where ID = 'ID01' AND timetag between '1990-01-01 00:00:00' AND '1990-01-20 00:00:00')
SELECT DATEDIFF(minute,mc.timetag,mp.timetag) as differ1, mc.timetag as timetag1 ,mp.timetag as timetag2
    FROM rows mc  JOIN rows mp On mc.rn = mp.rn - 1 where   DATEDIFF(minute,mc.timetag,mp.timetag) > 1 order by timetag1

该查询的输出是一个表,其中后续时间标记之间的差不等于1(分钟)。 例如:

differ1    timetag1               timetag2
2          1990-07-04 00:00:00    1990-07:04 00:02:00

如我所说,它在SQL服务器中运行很快,但是当我尝试从VBA执行查询时却非常慢。 有什么建议-特别是我遵循“最佳/最佳实践”选项从VBA连接到SQL Server的建议?

更新:更怪异的是,从第7个月及以上开始,它只会变慢。

如果仅打算读取记录,则可以尝试将LockType更改为adLockReadOnly。

您还可以将光标位置从客户端更改为服务器(AdUseServer)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM