Tôi hiện đang làm việc trên một dự án nhập số lượng lớn dữ liệu từ các tệp phẳng (csv) khoảng 18 tệp khác nhau, mỗi tệp liên kết đến một bảng cụ thể thông qua một số quy trình được lưu trữ.
Tôi đã làm theo các bước như được tư vấn trong hướng dẫn Hiệu suất tải dữ liệu .
Cơ sở dữ liệu ở BulkLogged
chế độ khôi phục để giảm thiểu việc ghi nhật ký, khi thực hiện quy trình được lưu trữ bên dưới trên một tệp chứa 600000 hàng tôi gặp lỗi
Msg 9002, Cấp 17, Trạng thái 4, Quy trình SP_Import__DeclarationClparentHistory_FromCSV, Dòng 34
Nhật ký giao dịch cho cơ sở dữ liệu đã đầy. Để tìm hiểu lý do tại sao không gian trong nhật ký không thể được sử dụng lại, hãy xem cột log numuse_wait_desc trong sys.database
(đối với mục đích thử nghiệm, tôi thực hiện sao lưu toàn bộ trước khi bắt đầu nhập).
Nhìn vào log_reuse_wait_desc
tôi thấy như sau:
log_reuse_wait_desc
KIỂM TRA . Tất cả các nhập khác được nhập thành công.
Bất kỳ đầu vào trong việc giải quyết này sẽ được hoan nghênh.
PROCEDURE [dbo].[SP_Import_DeclarationClearanceHistory_FromCSV]
@FilePath [nvarchar](1000)
AS
BEGIN
-- Creating a Temproary Table for importing the data from csv file.
DBCC TRACEON(610)
CREATE TABLE #DeclarationClearanceHistory
(
[ItemID] [int] IDENTITY(1, 1) NOT NULL ,
[CMSDeclarationID] [bigint] NOT NULL ,
[StatusCode] [nvarchar](10) NOT NULL ,
[SubStatus] [nvarchar](10) NULL ,
[DepartmentCode] [nvarchar](10) NULL ,
[StartDate] [datetime] NULL ,
[EndDate] [datetime] NULL ,
PRIMARY KEY CLUSTERED ( [ItemID] ASC )
WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
)
ON [PRIMARY]
-- Inserting all the from csv to temproary table using BULK INSERT
EXEC ('BULK INSERT #DeclarationClearanceHistory
FROM ''' + @FilePath + '''
WITH ( FIELDTERMINATOR = ''<,>'', ROWTERMINATOR =''\n'', FIRSTROW = 2, KEEPIDENTITY, CODEPAGE = ''ACP'', ORDER = ''ITEMID ASC'' );') ;
-- By using MERGE statement, inserting the record if not present and updating if exist.
MERGE dbo.DeclarationClearanceHistory AS TargetTable -- Inserting or Updating the table.
USING #DeclarationClearanceHistory AS SourceTable -- Records from the temproary table (records from csv file).
ON ( TargetTable.ItemID = SourceTable.ItemID ) -- Defining condition to decide which records are alredy present
WHEN NOT MATCHED BY TARGET
THEN INSERT (
ItemID ,
CMSDeclarationID ,
StatusCode ,
SubStatus ,
DepartmentCode ,
StartDate ,
EndDate
)
VALUES ( SourceTable.ItemID ,
SourceTable.CMSDeclarationID ,
SourceTable.StatusCode ,
SourceTable.SubStatus ,
SourceTable.DepartmentCode ,
SourceTable.StartDate ,
SourceTable.EndDate
)
WHEN MATCHED -- If matched then UPDATE
THEN UPDATE
SET TargetTable.ItemID = SourceTable.ItemID ,
TargetTable.CMSDeclarationID = SourceTable.CMSDeclarationID ,
TargetTable.StatusCode = SourceTable.StatusCode ,
TargetTable.SubStatus = SourceTable.SubStatus ,
TargetTable.DepartmentCode = SourceTable.DepartmentCode ,
TargetTable.StartDate = SourceTable.StartDate ,
TargetTable.EndDate = SourceTable.EndDate ;
DBCC TRACEOFF(610)
END