从VBA转到SQL Server 2008 R2时,如何提高数据库性能?

Tar*_*zan 2 excel vba excel-vba table-valued-parameters sql-server-2008-r2

我正在开发一个从Excel到SQL Server 2008 R2执行CRUD操作的财务应用程序.该应用程序使用VBA和ADO.我试图优化循环数千行的操作的性能,并将更新发送到数据库.目前,每行调用一次存储过程.

当用户与应用程序的连接速度较慢时,性能也很慢,足以让他们开始抱怨.为了优化性能,我试过:

  1. 将所有操作批处理为XML文件并立即将它们全部发送.不幸的是,性能变差了.
  2. 接下来我想到在表值参数中批量处理所有更新.但是,VBA和ADO不能使用表值参数.

我的事情已经不多了.从VBA转到SQL Server 2008 R2时,如何提高数据库性能?

Tar*_*zan 5

我想到了.虽然ADO中没有可用的表值参数(TVP)对象,但您可以在SQL Server连接上执行原始SQL语句.解决方案是:

  1. 构建使用TVP的SQL语句
  2. 在ADO连接上执行SQL语句.

例如:

Dim cnSQLServer As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strSQL As String

Set cnSQLServer = New ADODB.Connection
cnSQLServer.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security = SSPI"

' Build a SQL statement that uses a TVP
strSQL = "DECLARE @ReturnMessage nvarchar(255) " + _
    "DECLARE @catType CategoryTableType " + _
    "INSERT INTO @catType" + _
    "EXEC ('" + _
    "SELECT ''Organic'', ''Organically grown produce and grains'' " + _
    "SELECT ''Conventional'', ''Non-organically grown produce and grains'' " + _
    "SELECT ''Irish'', ''Mrs. O''''Leary''''s creamery products'' " + _
    "') " + _
    "EXEC dbo.usp_InsertCategory @catType, @ReturnMessage OUTPUT; " + _
    "SELECT @ReturnMessage as ReturnMessage'"

' Execute the SQL statement on the ADO connection.
Set rst = cnSQLServer.Execute(strSQL)
Run Code Online (Sandbox Code Playgroud)

在有关从MS Access调用TVP的文章中更详细地描述了该解决方案:在Access 2007中使用SQL Server 2008表值参数

使用TVP给我带来了不错的性能提升.希望这有助于其他人.干杯.