मुख्य समस्या पंक्तियों की अनुक्रमणिका को 1,2,3 में बदलने के बारे में है .. जहां संपर्क-आईडी और प्रकार समान है। लेकिन सभी कॉलम में एक ही डेटा हो सकता है क्योंकि कुछ पूर्व-कर्मचारी गड़बड़ हो जाते हैं और संपर्क-आईडी और टाइप द्वारा सभी पंक्तियों को अपडेट करते हैं। किसी भी तरह ऐसी पंक्तियां होती हैं जो गड़बड़ नहीं होती हैं लेकिन सूचकांक पंक्तियां समान होती हैं। यह कुल अराजकता है।कर्सर के अंदर कर्सर
मैंने बाहरी कर्सर से आने वाले चर के साथ एक आंतरिक कर्सर का उपयोग करने की कोशिश की। लेकिन ऐसा लगता है कि यह आंतरिक कर्सर में फंस गया है।
क्वेरी का एक हिस्सा इस तरह दिखता है:
Fetch NEXT FROM OUTER_CURSOR INTO @CONTACT_ID, @TYPE
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
DECLARE INNER_CURSOR Cursor
FOR
SELECT * FROM CONTACTS
where CONTACT_ID = @CONTACT_ID
and TYPE = @TYPE
Open INNER_CURSOR
Fetch NEXT FROM INNER_CURSOR
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
क्या समस्या हो सकती है? @@ FETCH_STATUS संदिग्ध या कुछ है?
संपादित करें:
UPDATE CONTACTS
SET INDEX_NO = @COUNTER
where current of INNER_CURSOR
संपादित करें: यहाँ बड़ी तस्वीर है:
BEGIN TRAN
DECLARE @CONTACT_ID VARCHAR(15)
DECLARE @TYPE VARCHAR(15)
DECLARE @INDEX_NO SMALLINT
DECLARE @COUNTER SMALLINT
DECLARE @FETCH_STATUS INT
DECLARE OUTER_CURSOR CURSOR
FOR
SELECT CONTACT_ID, TYPE, INDEX_NO FROM CONTACTS
WHERE
CONTACT_ID IN (SELECT CONTACT_ID FROM dbo.CONTACTS
WHERE CONTACT_ID IN(...)
GROUP BY CONTACT_ID, TYPE, INDEX_NO
HAVING COUNT(*) > 1
OPEN OUTER_CURSOR
FETCH NEXT FROM OUTER_CURSOR INTO @CONTACT_ID, @TYPE, @INDEX_NO
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
SET @COUNTER = 1
DECLARE INNER_CURSOR CURSOR
FOR
SELECT * FROM CONTACTS
WHERE CONTACT_ID = @CONTACT_ID
AND TYPE = @TYPE
FOR UPDATE
OPEN INNER_CURSOR
FETCH NEXT FROM INNER_CURSOR
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
UPDATE CONTACTS
SET INDEX_NO = @COUNTER
WHERE CURRENT OF INNER_CURSOR
SET @COUNTER = @COUNTER + 1
FETCH NEXT FROM INNER_CURSOR
END
CLOSE INNER_CURSOR
DEALLOCATE INNER_CURSOR
FETCH NEXT FROM OUTER_CURSOR INTO @CONTACT_ID, @TYPE, @INDEX_NO
END
CLOSE OUTER_CURSOR
DEALLOCATE OUTER_CURSOR
COMMIT TRAN
एक और सवाल: एसक्यूएल सर्वर का कौन सा संस्करण, क्योंकि यह निर्धारित करेगा कि हम आपके @ काउंटर को आंतरिक कर्सर में बदलने के लिए पंक्ति संख्या बनाने के लिए क्या उपयोग कर सकते हैं। –
क्या आप सेट आधारित तर्क के बारे में जानते हैं? कर्सर को अंतिम उपाय के रूप में उपयोग किया जाना चाहिए ... –
तो क्या आप उत्तर देने के लिए पर्याप्त दयालु हो सकते हैं? अगर आपको स्थिति के बारे में अधिक जानकारी चाहिए, तो मैं खुशी से इसे प्रदान करता हूं। –