2016-07-23 68 views
0

@proc_name表變量中,我有存儲過程名稱,並且我使用動態SQL傳遞參數。我正在使用while循環遍歷@proc_name中的所有行。我可以在這裏使用CTE來提高性能嗎?通過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),' ','')+''''+' ,'+'''' 
      [email protected]+''''+' , '+''''+cONvert(VARCHAR(100),@BusinessDate)+'''' 

    -- Update TDrawerSummary 
    PRINT (@proc_exec) 

    SET @count = @count + 1 
END 

謝謝。

+0

可能不能夠提高這麼多,但有點難以完全理解。你是否肯定需要'動態sql'來運行存儲過程遍歷每個recordin'@ proc_name'?存儲過程中實際發生了什麼? – sgeddes

+1

CTE(在SQL Server中)不會提高性能。他們確實使查詢更容易理解,不過。 –

+0

@GordonLinoff - 我已經讓他們提高了性能 - 從一個大表中選擇一小組字段,這些字段是唯一的,並且包含在cte的索引中,然後返回到表中以獲得其餘列。 – Hogan

回答

2

要下手,如下圖所示的光標代替WHILE循環:

DECLARE c CURSOR FOR 
    SELECT 'usp_Balance_' 
      +Replace(Description,' ','')+' '+' '+'''' 
      +Replace(TellerID,' ','')+''''+' ,'+'''' 
       [email protected]+''''+' , '+''''+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 
+0

我的建議非常好的代碼示例。好答案! – Hogan