我在 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: 目前,当我执行 EXEC(@Script) 时,我正在将值插入到我的注释中指定的“zTest”表中。
但是,“更新脚本表”所在的第二部分会更新我的脚本表中的所有行。我知道我需要为光标正在移动的相应行指定 ID。问题是,我该怎么做?我不想只更新适当的行,移动到下一个然后更新那个。
Q2: 我的下一个问题是,在 CATCH 块中,我认为只要 ScriptTable 的 Script 列中的一个查询出现错误,我就会创建一个无限循环,因为当我查看结果时,它只会继续和去。我不想打破;该过程因为我想将错误写入 Err 列并继续下一行,直到它到达@Script 的末尾,然后停止。
IDENT_CURRENT、Scope_Identity 等不起作用,因为我没有在脚本表中插入任何内容。
请帮忙。