Il problema principale riguarda la modifica dell'indice di righe su 1,2,3 .. dove ID di contatto e tipo sono uguali. ma tutte le colonne possono contenere esattamente gli stessi dati a causa di alcuni ex dipendenti incasinati e aggiornare tutte le righe per nome-contatto e tipo. in qualche modo ci sono righe che non sono disordinate ma le file di indice sono uguali. È il caos totale.Cursore all'interno del cursore
Ho provato a utilizzare un cursore interno con le variabili provenienti dal cursore esterno. Ma sembra che sia bloccato nel cursore interno.
Una parte della query si presenta così:
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)
Quale può essere il problema? @@ FETCH_STATUS è ambiguo o qualcosa del genere?
EDIT: sembra tutto bene, se io non uso questo codice all'interno cursore interno:
UPDATE CONTACTS
SET INDEX_NO = @COUNTER
where current of INNER_CURSOR
EDIT: ecco il quadro generale:
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
Un'altra domanda: quale versione di SQL Server, perché determinerà cosa possiamo usare per creare i numeri di riga per sostituire @counter nel cursore interno. –
Sei a conoscenza della logica basata su set? I cursori dovrebbero essere usati come ultima risorsa ... –
Quindi, puoi essere così gentile da offrire una risposta? se hai bisogno di maggiori informazioni sulla situazione, gentilmente me lo fornisco volentieri. –