Tôi nhận được tệp XML hàng ngày chứa hàng nghìn bản ghi, mỗi bản ghi là giao dịch kinh doanh mà tôi cần lưu trữ trong cơ sở dữ liệu nội bộ để sử dụng trong báo cáo và thanh toán . Tôi đã có ấn tượng rằng tập tin của mỗi ngày chỉ chứa các bản ghi duy nhất, nhưng đã phát hiện ra rằng định nghĩa của tôi về duy nhất không chính xác giống như của nhà cung cấp. Ứng dụng hiện tại nhập dữ liệu này là một ứng dụng bàn điều khiển C# .Net 3.5, nó sử dụng SqlBulkCopy vào bảng cơ sở dữ liệu MS SQL Server 2008, nơi các cột khớp chính xác với cấu trúc của các bản ghi XML. Mỗi bản ghi chỉ có hơn 100 trường, và không có khóa tự nhiên trong dữ liệu, hay đúng hơn là các trường tôi có thể đưa ra có ý nghĩa như một khóa tổng hợp kết thúc cũng phải cho phép null. Hiện tại bảng có nhiều chỉ mục, nhưng không có khóa chính.Làm thế nào để ngăn chặn bản ghi trùng lặp được chèn bằng SqlBulkCopy khi không có khóa chính
Về cơ bản toàn bộ hàng cần phải là duy nhất. Nếu một trường khác, trường đó đủ hợp lệ để chèn vào. Tôi đã xem xét việc tạo một băm MD5 của toàn bộ hàng, chèn nó vào cơ sở dữ liệu và sử dụng một ràng buộc để ngăn SqlBulkCopy chèn hàng, nhưng tôi không thấy cách lấy MD5 Hash vào hoạt động BulkCopy và tôi không chắc chắn nếu toàn bộ hoạt động sẽ thất bại và quay trở lại nếu bất kỳ một bản ghi nào bị lỗi, hoặc nếu nó sẽ tiếp tục.
Tệp có chứa số lượng bản ghi rất lớn, đi từng hàng trong XML, truy vấn cơ sở dữ liệu cho bản ghi khớp với tất cả các trường và sau đó quyết định chèn thực sự là cách duy nhất tôi có thể thấy điều này. Tôi chỉ hy vọng không phải viết lại hoàn toàn ứng dụng và thao tác sao chép hàng loạt nhanh hơn rất nhiều.
Có ai biết cách sử dụng SqlBulkCopy trong khi ngăn hàng trùng lặp, không có khóa chính không? Hoặc bất kỳ đề xuất cho một cách khác nhau để làm điều này?
Ngoài ra, không thêm chỉ mục vào bảng dàn của bạn cho đến sau khi nhập số lượng lớn (nhanh hơn) – CResults
@CResults: yes, nên đã đề cập rằng ... – gbn
Điều đó chắc chắn có ý nghĩa và dễ thực hiện. Cảm ơn. – kscott