[英]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.