धन्यवाद @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
SqlBulkCopy इस ऑपरेशन का समर्थन नहीं करता है। SqlBulkCopy के साथ एक अस्थायी तालिका में कॉपी करें और MERGE का उपयोग करें। खोज समाधान प्रकट करेंगे। –
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 –
"sqlbulkcopy अद्यतन" के लिए यहां खोजें। कोई पूरी छत नहीं है कि आप ऐसा नहीं कर सकते हैं, लेकिन आप यह जवाब कर सकते हैं। उनमें से एक मदद कर सकता है। –