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