Utiliser “OÙ le COURANT DE la” clause de mettre à jour seulement la ligne sur laquelle le CURSEUR est positionné dans SQL
J'ai le texte suivant curseur dans SQL:
DECLARE @Script varchar(max)
DECLARE @getScript CURSOR
SET @getScript = CURSOR FOR
SELECT [Script]
FROM ScriptTable
OPEN @getScript
FETCH NEXT
FROM @getScript INTO @Script
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC(@Script) --Working part. This executes the query stored in the Script column.
--For example INSERT INTO zTest VALUES(VAL1, VAL2, etc etc..)
UPDATE ScriptTable
SET DateDone = GETDATE(), IsDone = 1, Err = NULL
FETCH NEXT
FROM @getScript INTO @Script
END TRY
BEGIN CATCH
DECLARE @Err varchar(max)
SET @Err = ERROR_MESSAGE()
UPDATE ScriptTable
SET DateDone = GETDATE(), Err = @Err
END CATCH
END
CLOSE @getScript
DEALLOCATE @getScript
Q1:
Actuellement, je suis l'obtention de la valeur insérée dans le "test-z" table spécifiée dans mes commentaires quand j'execute EXEC(@Script).
Cependant, la deuxième partie où la "mise à Jour ScriptTable" est, les mises à jour de toutes les lignes dans ma Table de scripts. Je sais que j'ai besoin de spécifier l'ID de la ligne appropriée que le curseur se déplace à travers. La Question est, comment puis-je le faire? Je wan pas uniquement mettre à jour la ligne appropriée, de passer à la suivante, puis mise à jour de celui-là.
T2:
Ma prochaine question est, dans le bloc CATCH, je pense que je suis entrain de créer une boucle infinie dès qu'il y a une erreur dans une des requêtes dans le Script de la Colonne de la ScriptTable que quand je regarde les résultats, il ne cesse d'aller et venir. Je ne veux pas BRISER; la procédure que je veux écrire une erreur pour un Tre colonne et continuer avec les lignes suivantes jusqu'à ce qu'il atteigne la fin de l' @Script, puis de s'arrêter.
IDENT_CURRENT, Scope_Identity etc ne fonctionne pas car je n'ai pas inséré quoi que ce soit dans les Scripts de la Table.
S'il vous plaît aider.
Vous devez vous connecter pour publier un commentaire.
Concernant T1, vous devez avoir une clé primaire dans le but d'utiliser le curseur pour la mise à jour (bien qu'il existe des solutions de contournement).
En général, vous aurez envie de syntaxe quelque chose comme ceci:
Concernant la Q2, il sensé de dire que c'est une boucle infinie. Lorsque vous utilisez le
TRY
etCATCH
clauses et il échoue, il ne veut pas signer tout de la syntaxe dans laTRY
"zone".A cet effet le
FETCH NEXT
a sauté, et dans la boucle suivante, la même erreur se produit de nouveau.Assurez-vous qu'il ya toujours un
FETCH NEXT
dans la boucle.Espère que cela vous aide un peu.
Voici mon code final si quelqu'un est intéressé:
WHERE CURRENT OF
à la place. Vous l'utilisez dans le bloc CATCH..!Ce:
Ou ceci: