2012-09-20 16 views
14

Powiel możliwe:
Any way to SQLBulkCopy “insert or update if exists”?C# Luzem Wstaw SQLBulkCopy - Aktualizacja Jeśli wykryte

Używam SQLBulkCopy wstawić rekordy Duże

Jak mogę wykonać na aktualizację (zamiast wkładka) w rekordach, które już istnieją? Czy jest to możliwe z SQLBulkCopy?

To jest mój kod SQLBulkCopy

using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity)) 
{ 
    bulkCopy.BatchSize = CustomerList.Count; 
    bulkCopy.DestinationTableName = "dbo.tCustomers"; 
    bulkCopy.ColumnMappings.Clear(); 
    bulkCopy.ColumnMappings.Add("CustomerID", "CustomerID"); 
    bulkCopy.ColumnMappings.Add("FirstName", "FirstName"); 
    bulkCopy.ColumnMappings.Add("LastName", "LastName"); 
    bulkCopy.ColumnMappings.Add("Address1", "Address1"); 
    bulkCopy.ColumnMappings.Add("Address2", "Address2"); 
    bulkCopy.WriteToServer(CustomerList); 
} 

Szczegóły aplikacji

  1. ASP.net MVC 3.0 Razor zobaczyć Silnik
  2. SQL Server 2008
+3

SqlBulkCopy nie obsługuje tej operacji. Skopiuj do tabeli tymczasowej za pomocą SqlBulkCopy i użyj polecenia MERGE. Wyszukiwania ujawnią rozwiązania. –

+0

http://stackoverflow.com/questions/1700487/using-sqlbulkcopy-to-insert-update-database?rq=1, http://stackoverflow.com/questions/12292644/speed-up-update-of-185k -rows-in-sql-server-2008/12379039 # 12379039 (moja odpowiedź, brak szczegółów), http://stackoverflow.com/questions/4889123/any-way-to-sqlbulkcopy-insert-or-update-if -istnieje –

+0

Tu szukaj "aktualizacji sqlbulkcopy". Jest cała masa nie, nie możesz tego zrobić, ale możesz to zrobić. Jeden z nich może pomóc. –

Odpowiedz

18

Dzięki @pst

z jego sugestiami tak to zaimplementowałem, jeśli ktokolwiek musi wdrożyć podobne.

Luzem Wstaw do stałej tabeli Temp

using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity)) 
      { 
       bulkCopy.BatchSize = CustomerList.Count; 
       bulkCopy.DestinationTableName = "dbo.tPermanentTempTable"; 
       bulkCopy.ColumnMappings.Clear(); 
       bulkCopy.ColumnMappings.Add("CustomerID", "CustomerID"); 
       bulkCopy.ColumnMappings.Add("FirstName", "FirstName"); 
       bulkCopy.ColumnMappings.Add("LastName", "LastName"); 
       bulkCopy.ColumnMappings.Add("Address1", "Address1"); 
       bulkCopy.ColumnMappings.Add("Address2", "Address2"); 
       bulkCopy.WriteToServer(CustomerList); 
      } 

Następnie wywołania procedury przechowywanej do scalania temp tabeli z rzeczywistej tabeli

using (Entities context = new Entities()) 
      { 
       System.Nullable<int> iReturnValue = context.usp_Customer_BulkUploadMerge(customerid, locationID).SingleOrDefault(); 
       if (iReturnValue.HasValue) 
       { 
        // return was successful! 
       } 
      } 

ten sposób użyłem seryjnej w moim procedura składowana

ALTER PROCEDURE usp_Customer_BulkUploadMerge 
    (
     @CustomerID INT , 
     @locationID INT 
    ) 
AS 
    BEGIN 
    DECLARE @retValue INT 
     BEGIN TRY 
      IF OBJECT_ID('tCustomers') IS NOT NULL 
       BEGIN 
        BEGIN TRANSACTION MergPatientsTable 
        SET NOCOUNT ON; 
        MERGE dbo.tCustomers AS target 
         USING 
          (SELECT PU.CustomerID , 
             PU.LocationID , 
             PU.FirstName , 
             PU.LastName , 
             PU.MiddleInitial , 
             PU.Gender , 
             PU.DOB 

           FROM  dbo.tPermanentTempTable PU 
           WHERE  PU.CustomerID = @CustomerID 
             AND PU.LocationID = @locationID 
           GROUP BY PU.CustomerID , 
             PU.LocationID , 
             PU.FirstName , 
             PU.LastName , 
             PU.MiddleInitial , 
             PU.Gender , 
             PU.DOB 

          ) AS source (CustomerID, LocationID, FirstName, 
              LastName, MiddleInitial, Gender, DOB) 
         ON (LOWER(target.FirstName) = LOWER(source.FirstName) 
          AND LOWER(target.LastName) = LOWER(source.LastName) 
          AND target.DOB = source.DOB 
          ) 
         WHEN MATCHED 
          THEN 
     UPDATE    SET 
       MiddleInitial = source.MiddleInitial , 
       Gender = source.Gender,    
       LastActive = GETDATE() 
         WHEN NOT MATCHED 
          THEN  
     INSERT (
        CustomerID , 
        LocationID , 
        FirstName , 
        LastName , 
        MiddleInitial , 
        Gender , 
        DOB , 
        DateEntered , 
        LastActive 
       )    VALUES 
       (source.CustomerID , 
        source.LocationID , 
        source.FirstName , 
        source.LastName , 
        source.MiddleInitial , 
        source.Gender , 
        source.DOB , 
        GETDATE() , 
        NULL 
       ); 
        DELETE PU 
        FROM dbo.tPermanentTempTable PU 
        WHERE PU.CustomerID = @CustomerID 
          AND PU.LocationID = @locationID 
        COMMIT TRANSACTION MergPatientsTable 
        SET @retValue = 1 
        SELECT @retValue 
       END 
      ELSE 
       BEGIN 
       SET @retValue = -1 
        SELECT @retValue 
       END 
     END TRY 
     BEGIN CATCH 
      ROLLBACK TRANSACTION MergPatientsTable 
      DECLARE @ErrorMsg VARCHAR(MAX); 
      DECLARE @ErrorSeverity INT; 
      DECLARE @ErrorState INT; 
      SET @ErrorMsg = ERROR_MESSAGE(); 
      SET @ErrorSeverity = ERROR_SEVERITY(); 
      SET @ErrorState = ERROR_STATE(); 
     SET @retValue = 0 
     SELECT @retValue 
      -- SELECT 0 AS isSuccess 
     END CATCH 
    END 
Powiązane problemy