[英]Import from txt (MS Access 2013) to SQL Server 2016 slow
我的本地 PC 上有一個txt
文件,必須對其進行檢查,然后使用 ADODB 使用 MS Access 中的存儲過程將其逐行上傳到 SQL Server 2016。 看起來 Access 總是快速運行 2 行,然后短暫停止。
在 MS Access 中,我使用的是 function:
Public Function ImportData(FileString As String)
Dim WholeLine As String
Dim cc As Variant
Dim sapPurchaseDocument As String
Dim sapPartNumber As String
Dim sapPartName As String
Dim sapDocumentDate As String
Dim sapSupplier As String
Dim sapPlant As String
Dim sapSLoc As String
Dim sapQuantity As Double
Dim sapUOM As String
Dim sapTargetQuantity As Double
Dim sapDeliveryDate As String
Dim sapPrevQuantity As Double
Dim sapReceivedQuantity As Double
Dim sapIssuedQuantity As Double
Dim sapDeliveredQuantity As Double
Dim sapPurchaseRequisition As String
Dim sapPurchaseRequisitionItem As String
Dim sapCreationIndicatior As String
Dim sapNoOfPositions As Double
Dim totalCount As Integer
Dim sapPurchaseDocumentItem As String
Dim rs As New ADODB.Recordset
Call GetConnection
Set rs.ActiveConnection = myCN
If Right(FileString, 3) = "txt" Then
totalCount = GetRowCount(FileString)
Open FileString For Input As #1
i = 0
Do While Not EOF(1)
Line Input #1, WholeLine
If Left(WholeLine, 3) = "| 4" Then
'Debug.Print WholeLine
cc = Split(WholeLine, "|")
sapPurchaseDocument = Trim(cc(1))
sapPartNumber = Trim(Replace(cc(2), ".", ""))
sapPartName = Trim(Replace(cc(3), "'", ""))
sapDocumentDate = Right(cc(4), 4) & "-" & Mid(cc(4), 4, 2) & "-" & Left(cc(4), 2)
sapSupplier = cc(5)
sapPlant = cc(6)
sapSLoc = cc(7)
sapQuantity = Replace(cc(8), ",", "")
sapUOM = Trim(cc(9))
sapTargetQuantity = Replace(cc(10), ",", "")
sapDeliveryDate = Right(cc(11), 4) & "-" & Mid(cc(11), 4, 2) & "-" & Left(cc(11), 2)
sapPrevQuantity = cc(12)
sapReceivedQuantity = Replace(cc(13), ",", "")
sapIssuedQuantity = Replace(cc(14), ",", "")
sapDeliveredQuantity = Replace(cc(15), ",", "")
sapPurchaseRequisition = Trim(cc(16))
sapPurchaseRequisitionItem = Trim(cc(17))
sapCreationIndicatior = cc(18)
sapNoOfPositions = cc(19)
sapPurchaseDocumentItem = Trim(cc(20))
strSQL = "spInsertUpdateSAPME2M '" & sapPurchaseDocument & "', '" & sapPartNumber & "', '" & sapPartName & "', '" & _
sapDocumentDate & "', '" & sapSupplier & "', '" & sapPlant & "', '" & sapSLoc & "', " & _
sapQuantity & ", '" & sapUOM & "', " & sapTargetQuantity & ", '" & sapDeliveryDate & "', " & _
sapPrevQuantity & ", " & sapReceivedQuantity & ", " & sapIssuedQuantity & ", " & _
sapDeliveredQuantity & ", '" & sapPurchaseRequisition & "', '" & sapPurchaseRequisitionItem & "', '" & _
sapCreationIndicatior & "', '" & sapNoOfPositions & "', '" & sapPurchaseDocumentItem & "'"
rs.Open (strSQL)
DoEvents
End If
i = i + 1
Debug.Print i
Forms!frm_Overview.lblStatus.Caption = "Record " & i & " of " & totalCount & " loaded. Please wait!"
DoEvents
'Refresh
Loop
MsgBox "Import done"
End If
Close #1
End Function
在 SQL 服務器上,我有一個如下所示的存儲過程:
USE [MOBILEPRINT]
GO
/****** Object: StoredProcedure [dbo].[spInsertUpdateSAPME2M] Script Date: 5/25/2020 11:39:31 AM ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
CHANGE NO ACTION
ALTER PROCEDURE [dbo].[spInsertUpdateSAPME2M]
-- Add the parameters for the stored procedure here
@sapPurchaseDocument varchar(50),
@sapPartNumber varchar(50),
@sapPartName varchar(300),
@sapDocumentDate date,
@sapSupplier varchar(50),
@sapPlant varchar(100),
@sapSLoc varchar(50),
@sapQuantity float,
@sapUOM varchar(50),
@sapTargetQuantity float,
@sapDeliveryDate date,
@sapPrevQuantity float,
@sapReceivedQuantity float,
@sapIssuedQuantity float,
@sapDeliveredQuantity float,
@sapPurchaseRequisition varchar(50),
@sapPurchaseRequisitionItem varchar(50),
@sapCreationIndicatior varchar(50),
@sapNoOfPositions varchar(50),
@sapPurchaseDocumentItem varchar(50)
AS
BEGIN TRANSACTION
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @RESULT int
DECLARE @UPDATE_CHECK int
DECLARE @UpdateDate datetime = GetDate()
BEGIN
SELECT @RESULT = COUNT(sapPurchaseDocument) FROM SAP_ME2M WHERE sapPurchaseDocument = @sapPurchaseDocument AND sapPartNumber = @sapPartNumber
IF ISNULL(@RESULT,0) = 0
BEGIN
INSERT INTO SAP_ME2M (
sapPurchaseDocument,
sapPartNumber,
sapPartName,
sapDocumentDate,
sapSupplier,
sapPlant,
sapSLoc,
sapQuantity,
sapUOM,
sapTargetQuantity,
sapDeliveryDate,
sapPrevQuantity,
sapReceivedQuantity,
sapIssuedQuantity,
sapDeliveredQuantity,
sapPurchaseRequisition,
sapPurchaseRequisitionItem,
sapCreationIndicatior,
sapNoOfPositions,
ChangeDate,
sapPurchaseDocumentItem)
VALUES
(@sapPurchaseDocument, @sapPartNumber, @sapPartName, @sapDocumentDate, @sapSupplier, @sapPlant,
@sapSLoc, @sapQuantity, @sapUOM, @sapTargetQuantity, @sapDeliveryDate, @sapPrevQuantity,
@sapReceivedQuantity, @sapIssuedQuantity, @sapDeliveredQuantity, @sapPurchaseRequisition,
@sapPurchaseRequisitionItem, @sapCreationIndicatior, @sapNoOfPositions, @UpdateDate, @sapPurchaseDocumentItem)
END
ELSE
SELECT @UPDATE_CHECK = COUNT(*) FROM SAP_ME2M WHERE
sapPurchaseDocument = @sapPurchaseDocument AND
sapPartNumber = @sapPartNumber AND
sapPartName = @sapPartName AND
sapDocumentDate = @sapDocumentDate AND
sapSupplier = @sapSupplier AND
sapPlant = @sapPlant AND
sapSLoc = @sapSLoc AND
sapQuantity = @sapQuantity AND
sapUOM = @sapUOM AND
sapTargetQuantity = @sapTargetQuantity AND
sapDeliveryDate = @sapDeliveryDate AND
sapPrevQuantity = @sapPrevQuantity AND
sapReceivedQuantity = @sapReceivedQuantity AND
sapIssuedQuantity = @sapIssuedQuantity AND
sapDeliveredQuantity = @sapDeliveredQuantity AND
sapPurchaseRequisition = @sapPurchaseRequisition AND
sapPurchaseRequisitionItem = @sapPurchaseRequisitionItem AND
sapCreationIndicatior = @sapCreationIndicatior AND
sapNoOfPositions = @sapNoOfPositions AND
sapPurchaseDocumentItem = @sapPurchaseDocumentItem
IF @UPDATE_CHECK = 0
BEGIN
UPDATE SAP_ME2M SET
sapPartName = @sapPartName ,
sapDocumentDate = @sapDocumentDate ,
sapSupplier = @sapSupplier ,
sapPlant = @sapPlant ,
sapSLoc = @sapSLoc ,
sapQuantity = @sapQuantity ,
sapUOM = @sapUOM ,
sapTargetQuantity = @sapTargetQuantity ,
sapDeliveryDate = @sapDeliveryDate ,
sapPrevQuantity = @sapPrevQuantity ,
sapReceivedQuantity = @sapReceivedQuantity ,
sapIssuedQuantity = @sapIssuedQuantity ,
sapDeliveredQuantity = @sapDeliveredQuantity ,
ChangeDate = @UpdateDate
WHERE
sapPartNumber = @sapPartNumber AND
sapPartName = @sapPartName AND
sapDocumentDate = @sapDocumentDate AND
sapSupplier = @sapSupplier AND
sapPlant = @sapPlant AND
sapSLoc = @sapSLoc AND
sapPurchaseDocumentItem = @sapPurchaseDocumentItem
END
END
COMMIT TRANSACTION WITH (DELAYED_DURABILITY = ON);
我必須上傳大約 30000 條記錄,目前需要一個多小時。
如果您有建議,請告訴我。
對於快速數據傳輸,請使用啟用了批處理操作的斷開連接的記錄集。
Dim conn As ADODB.Connection
Call GetConnection
Set conn = myCN
Dim rs As New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open "Table1", conn, adOpenForwardOnly, adLockBatchOptimistic
'Disconnect
Set rs.ActiveConnection = Nothing
Dim i As Long
For i = 1 To 3000
rs.AddNew
rs.Fields(1) = i
Next
'Reconnect
Set rs.ActiveConnection = conn
'Batch insert
rs.UpdateBatch
Debug.Print Now()
對我來說,這在 2 秒內執行,但它很大程度上取決於 SQL 服務器的位置。
然后,在上傳時對數據集進行進一步處理。 基於每條記錄的處理通常會很慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.