mysql存储过程游标循环




如何从另一个存储过程中迭代存储过程结果...没有光标? (5)

一个丑陋的解决办法是让你的程序每次使用另一个表(或现有表上的某个标志)调用时,返回“下一个”标识符以过滤出它已经返回的行

我不确定这是否是我应该在T-SQL中做的事情,而且我很确定在这个上下文中使用单词“iterate”是错误的,因为你不应该在sql中迭代任何东西。 它应该是一个基于集合的操作,正确的? 无论如何,这里的情况是:

我有一个存储过程返回许多uniqueidentifiers(单列结果)。 这些ID是另一个表中记录的主键。 我需要在该表中的所有相应记录上设置一个标志。

我如何做到这一点,而不使用游标? 应该是一个容易为你的sql大师!


如果你升级到SQL 2008那么你可以传递表参数我相信。 否则,您将被困在全局临时表中,或者创建一个包含某种进程ID的列的永久表,以确定对存储过程的哪个调用是相关的。

您在更改生成ID的存储过程时有多少空间? 你可以在那里添加代码来处理它,或者有一个参数,当你调用它的时候,你可以选择标记这些行。


您可以使用一个临时表或表变量与一个额外的列:

DECLARE @MyTable TABLE (
    Column1 uniqueidentifer,
    ...,
    Checked bit
)

INSERT INTO @MyTable
SELECT [...], 0 FROM MyTable WHERE [...]

DECLARE @Continue bit
SET @Continue = 1
WHILE (@Continue)
BEGIN
    SELECT @var1 = Column1,
           @var2 = Column2,
           ...
    FROM @MyTable
    WHERE Checked = 1

    IF @var1 IS NULL
        SET @Continue = 0
    ELSE
    BEGIN

        ...

        UPDATE @MyTable SET Checked = 1 WHERE Column1 = @var1
    END
END

编辑:其实,在你的情况下加入会更好; 上面的代码是一个无游标的迭代,这是你的情况矫枉过正。


使用临时表或表变量(您正在使用SS2005)。

虽然这不是可嵌套的,但是如果存储过程使用该方法,则无法将该输出放到临时表中。


这可能不是最有效的,但我会创建一个临时表来保存存储过程的结果,然后在目标表的连接中使用它。 例如:

CREATE TABLE #t (uniqueid int)
INSERT INTO #t EXEC p_YourStoredProc

UPDATE TargetTable 
SET a.FlagColumn = 1
FROM TargetTable a JOIN #t b 
    ON a.uniqueid = b.uniqueid

DROP TABLE #t




tsql