通过CTE迭代并执行

时间:2016-07-23 21:57:08

标签: sql sql-server tsql

@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

谢谢。

1 个答案:

答案 0 :(得分:2)

首先,用光标替换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