【问题标题】:Convert vba to SQL Server stored procedure将 vba 转换为 SQL Server 存储过程
【发布时间】:2017-03-10 05:44:59
【问题描述】:

我有一个 Access2003 数据库,其中有一个从 SQL Server 数据库链接的表。我有这个更新该 SQL Server 表中的列的 Access vba。每个月清空表并导入新的记录集,记录数量从 300,000 到 每月450,000。

此 Access vba 代码运行但需要 5 个多小时。我需要对此做点什么,有人对如何加快速度有任何想法吗?我的一个想法是将其转换为 SQL Server 上的存储过程,但我不知道如何编写它,因此不胜感激。

谢谢

嘘。

VBA 代码:

' update the ID field in the import table 
Dim intCounter As Double 
Set MyRec = MyDB.OpenRecordset("tblMarsImport", dbOpenDynaset, dbSeeChanges) 

MyRec.MoveFirst 
intCounter = Format(Date, "yyyymmdd") & "000001" 

Do While Not MyRec.EOF 
   MyRec.Edit 
   MyRec!MarsID = CStr(intCounter) 
   MyRec.Update 
   MyRec.MoveNext 
   intCounter = intCounter + 1 
Loop 

MyRec.Close 

【问题讨论】:

  • 即使坚持使用 Access,您也可以加快速度,将代码从 DAO 更改为 ADODB,然后使用 Transaction 只执行最少时间的写入操作,300K+ 太高了,所以每 65K 执行一次 Commit
  • 我怀疑类似 `Update set = + ROW_NUMBER OVER(ORDER BY )' see MSDN for Row_Number。但是你需要一些格式化代码。
  • 将数据导入表中,然后添加idcolumn alter table [yourtable] add ID int identity (1,1) 这样会快很多。

标签: sql-server vba


【解决方案1】:
DECLARE @Result int
SELECT @Result = (SELECT SUM (row_count)
FROM sys.dm_db_partition_stats 
WHERE object_id=OBJECT_ID('tblMarsImport')    
AND (index_id=0 or index_id=1))
SELECT @Result

SET I=1
REPEAT
Update tblMarsImport set MarsID = Cast(Replace(Convert(varchar(10), Date, 120), '-', '') As int)
 + RIGHT('00000' + I, 6)

  SET I=I+1
UNTIL I>@Result

您可能需要稍微调整一下日期,但这应该会让您非常接近。

编辑:再想一想,您的表中需要一个 Identity 列(类似于 Access 中的 AutoNumber 字段),以便您可以通过在 Update 命令中使用 WHERE 子句来选择要更新的记录的 ID .否则,它只会一遍又一遍地更新相同的记录。

【讨论】:

  • 我的 table(tblMarsImport) 确实有一个名为 ImpID 的身份字段,但我不知道如何在 Update 语句的 where 子句中使用它。你能帮忙吗?
  • 尝试这样的事情(你可能需要稍微弄乱一下):Update tblMarsImport set MarsID = Cast(Replace(Convert(varchar(10), Date, 120), '-', '') As int) + RIGHT('00000' + I, 6) WHERE ImpID = I 想法是,您必须告诉它要更新哪条记录,并且使用 Identity 字段将始终只查看一条记录,因为身份字段必须是唯一的。我希望这是有道理的。
【解决方案2】:

您可能需要查看 Row_number 以跟踪您当前正在循环的行。这样您就不需要向表中添加新列。 [行号文档][1] https://msdn.microsoft.com/en-us/library/ms186734.aspx

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 2020-06-06
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多