2010-07-26 7 views
9

मैं एसक्यूएल सर्वर 2008 का उपयोग कर रहा है, और INSERT बयानसंभव SQL सर्वर के साथ नकली चाबी अद्यतन पर MySQL कार्यक्षमता अनुकरण

वर्तमान विरासत कोड करता है के लिए mySQL के पर DUPLICATE KEY UPDATE खंड की तरह कुछ का लाभ लेने में सक्षम होना चाहते हैं एक हटा सकते हैं और बाद में डालने कि अलग धागे से नकली चाबी आवेषण के साथ संगामिति मुद्दों में चल रहा है:

यहाँ त्रुटि मैं अपने उत्पादन वातावरण में देखें:

Violation of PRIMARY KEY constraint 'PK_Audience'. Cannot insert duplicate key in object 'dbo.Audience'. 

(sp_ContentUpdate)

प्राथमिक कुंजी:

AudienceId, VersionId 

हमलावर एसक्यूएल:

DELETE FROM dbo.Audience 
WHERE VersionId = @VersionId 

IF @AudienceXml IS NOT NULL 
    BEGIN 
    INSERT INTO dbo.Audience (
     VersionId, 
     AudienceId, 
     CreatedDate, 
     CreatedByPersonId, 
     ) 
    SELECT @VersionId, 
      AudienceId, 
      GETUTCDATE(), 
      @PersonId 
       FROM dbo.Audience 
    JOIN @AudienceXml.nodes('/Audiences/Audience') node(c) 
    ON  Audience.AudienceName = c.value('@Name', 'nvarchar(50)') 
    END 

रैपिंग किसी लेनदेन में इस TSQL या तो समय बदलकर संगामिति मुद्दा हटाने या मुद्दा मुखौटा लगता है। हालांकि, मुझे नहीं लगता कि एक लेनदेन में लपेटने से वास्तव में समेकन हल हो गया है।

शायद मैं इस गलत के बारे में जा रहा हूं। आपके सुझावों की सराहना की जाती है।

+0

संभव डुप्लिकेट (http: // stackoverflow .com/प्रश्न/1197733/करता-sql-server-offer-anything-like-mysqls-on-duplicate-key-update) –

उत्तर

10

ठीक है, विधेयक हम सभी को हरा, लेकिन यहाँ यह कैसा लग सकता है का एक नमूना है:

Merge dbo.Audience As target 
Using (
     Select @VersionId As VersionId, AudienceId, GetUtcDate() As CreatedDate, @PersonId As CreatedByPersonId 
     From dbo.Audience 
      Join @AudienceXml.nodes('/Audiences/Audience') node(c) 
       On Audience.AudienceName = c.value('@Name', 'nvarchar(50)') 
     ) 
When Matched Then 
    Update 
    Set VersoinId = target.VersionId, Audience = target.AudienceId 
     , CreatedDate = target.CreatedDate 
     , CreatedByPersionId = target.CreatedByPersonId 
When Not Matched Then 
    Insert dbo.Audience(VersionId, AudienceId, CreatedDate, CreatedByPersonId) 
की [करता है एसक्यूएल सर्वर MySQL के पर नकली चाबी अद्यतन की तरह कुछ भी प्रस्ताव]
+1

+1 उदाहरण के लिए चीयर्स, थॉमस। –

+0

+1 वाह, काम करने के लिए धन्यवाद। –

+1

@ बिल करविन - थक्स। जब आपने उत्तर दिया, तो मुझे रास्टी के चरित्र की तरह लगा जब वह शाऊल को महासागर के 11 में भर्ती करने की कोशिश करता है। "थॉमस, मैंने आज सुबह उठने से पहले जवाब देखा।" लेकिन, कुछ अतिरिक्त काम के लिए ब्राउनी पॉइंट भी अच्छा है। :) – Thomas

8

आप कैसे Microsoft SQL सर्वर 2008 यह वास्तव में इस स्थिति से निपटने में एएनएसआई/आईएसओ एसक्यूएल तरीका है में MERGE बयान का उपयोग करने के बारे में पढ़ा जाना चाहिए (MySQL के पर नकली चाबी एक मालिकाना MySQLism है)।

एमएसडीएन पर MERGE statement पर दस्तावेज़ देखें।

+1

+1: ड्रैट्स, मुझे इसे हराया। –

संबंधित मुद्दे