在@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
谢谢。
答案 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