繁体   English   中英

通过CTE迭代并执行

[英]Iterate and execute through CTE

@proc_name表变量中,我已经存储了过程名称,并且正在使用动态SQL传递参数。 我正在使用while循环遍历@proc_name所有行。 我可以在此处使用CTE来提高性能吗?

SELECT * 
FROM @proc_name

WHILE (@count <= @max)
BEGIN
    SET @proc_exec = 'usp_Balance_'
        +Replace((SELECT Description FROM @proc_name WHERE rn= @count),' ','')+' '+' '+''''
        +Replace((SELECT TellerID FROM @proc_name WHERE rn= @count),' ','')+''''+' ,'+''''
            +@LocationID+''''+' , '+''''+cONvert(VARCHAR(100),@BusinessDate)+''''

    -- Update TDrawerSummary
    PRINT (@proc_exec) 

    SET @count = @count + 1
END

谢谢。

首先,用光标替换WHILE循环,如下所示:

DECLARE c CURSOR FOR
    SELECT 'usp_Balance_'
            +Replace(Description,' ','')+' '+' '+''''
            +Replace(TellerID,' ','')+''''+' ,'+''''
                +@LocationID+''''+' , '+''''+cONvert(VARCHAR(100),@BusinessDate)+''''
    FROM @proc_name
    ORDER BY rn
OPEN c
FETCH c INTO @proc_exec
WHILE @@FETCH_STATUS=0
    BEGIN
        -- Update TDrawerSummary
        PRINT @proc_exec
        FETCH c INTO @proc_exec
    END
CLOSE c
DEALLOCATE c

在某些情况下,您可以使用CTE来帮助将过程代码转换为查询。 这样可以提高性能。 如果您可以共享构建@proc_name的代码,则可以检查是否有这种可能性。

在光标内部,您应该考虑采取一些措施来帮助您查找错误。 在当前代码中,很难知道在哪个迭代中发生了错误。 简化示例如下所示:

    BEGIN TRY
        -- Update TDrawerSummary
        PRINT @proc_exec
    END TRY
    BEGIN CATCH
        PRINT 'Failed executing '+COALESCE(@proc_exec,'(null)')+': '+ERROR_MESSAGE()
    END CATCH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM