2012-09-20 15 views
14

संभव डुप्लिकेट:
Any way to SQLBulkCopy “insert or update if exists”?सी # थोक सम्मिलित SqlBulkCopy - अद्यतन मौजूद है

मैं SQLBulkCopy उपयोग कर रहा हूँ थोक रिकॉर्ड

मैं अद्यतन पर कैसे प्रदर्शन कर सकते हैं (बजाय डालने के लिए एक सम्मिलित) रिकॉर्ड पर जो पहले से मौजूद है? क्या यह SQLBulkCopy के साथ संभव है?

यह 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); 
} 

अनुप्रयोग विवरण

  1. ASP.net MVC 3.0 उस्तरा
  2. एसक्यूएल सर्वर 2008
+3

SqlBulkCopy इस ऑपरेशन का समर्थन नहीं करता है। SqlBulkCopy के साथ एक अस्थायी तालिका में कॉपी करें और MERGE का उपयोग करें। खोज समाधान प्रकट करेंगे। –

+0

http://stackoverflow.com/questions/1700487/using-sqlbulkcopy-to-insert-update-database?rq=1, http://stackoverflow.com/questions/12292644/speed-up-update-of-185k -रो-इन-एसक्यूएल-सर्वर -2008/12379039 # 12379039 (मेरा उत्तर, हालांकि कोई विवरण नहीं), http://stackoverflow.com/questions/4889123/any-way-to-sqlbulkcopy-insert-or-update-if -exists –

+0

"sqlbulkcopy अद्यतन" के लिए यहां खोजें। कोई पूरी छत नहीं है कि आप ऐसा नहीं कर सकते हैं, लेकिन आप यह जवाब कर सकते हैं। उनमें से एक मदद कर सकता है। –

उत्तर

18

धन्यवाद @pst को

इंजन देखने

उनके सुझावों के साथ इस तरह मैंने कार्यान्वित किया है, अगर किसी को भी इसी तरह लागू करना है।

थोक स्थायी अस्थायी तालिका में सम्मिलित करें

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); 
      } 

तब वास्तविक तालिका के साथ अस्थायी तालिका मर्ज करने के लिए एक संग्रहीत प्रक्रिया कॉल

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

यह कैसे मैं अपने संग्रहीत प्रक्रिया

में मर्ज प्रयोग किया जाता है
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 
संबंधित मुद्दे