簡體   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